This is an automated email from the ASF dual-hosted git repository. bchapuis pushed a commit to branch 764-sql-script in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git
commit de6010e9918396028967774fb475ae3f9ef29a1a Author: Bertil Chapuis <[email protected]> AuthorDate: Fri Sep 1 13:16:24 2023 +0200 Add task to execute sql script --- .../org/apache/baremaps/utils/PostgresUtils.java | 26 ++++++++++++--- .../java/org/apache/baremaps/workflow/Task.java | 1 + .../apache/baremaps/workflow/tasks/ExecuteSql.java | 5 +-- .../baremaps/workflow/tasks/ExecuteSqlScript.java | 37 ++++++++++++++++++++++ .../workflow/tasks/ExecuteSqlScriptTest.java | 31 ++++++++++++++++++ baremaps-core/src/test/resources/script.sql | 5 +++ 6 files changed, 99 insertions(+), 6 deletions(-) diff --git a/baremaps-core/src/main/java/org/apache/baremaps/utils/PostgresUtils.java b/baremaps-core/src/main/java/org/apache/baremaps/utils/PostgresUtils.java index e1768a15..e9679483 100644 --- a/baremaps-core/src/main/java/org/apache/baremaps/utils/PostgresUtils.java +++ b/baremaps-core/src/main/java/org/apache/baremaps/utils/PostgresUtils.java @@ -55,20 +55,38 @@ public final class PostgresUtils { /** * Creates a data source from a JDBC url with a pool size defined by the user. * - * @param url the JDBC url + * @param jdbcUrl the JDBC url * @param poolSize the pool size * @return the data source */ - public static DataSource createDataSource(String url, int poolSize) { + public static DataSource createDataSource(String jdbcUrl, int poolSize) { if (poolSize < 1) { throw new IllegalArgumentException("PoolSize cannot be inferior to 1"); } - HikariConfig config = new HikariConfig(); - config.setJdbcUrl(url); + var multiQueriesJdbcUrl = withAllowMultiQueriesParameter(jdbcUrl); + var config = new HikariConfig(); + config.setJdbcUrl(multiQueriesJdbcUrl); config.setMaximumPoolSize(poolSize); return new HikariDataSource(config); } + /** + * Appends the multi-queries parameter to the given JDBC URL. + * + * @param jdbcUrl the JDBC URL + * @return the JDBC URL with the multi-queries parameter + */ + private static String withAllowMultiQueriesParameter(String jdbcUrl) { + if (jdbcUrl == null || jdbcUrl.isEmpty()) { + return jdbcUrl; + } + if (jdbcUrl.contains("?")) { + return jdbcUrl + "&allowMultiQueries=true"; + } else { + return jdbcUrl + "?allowMultiQueries=true"; + } + } + /** * Executes the queries contained in a resource file. * diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/Task.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/Task.java index 65676fef..901e130d 100644 --- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/Task.java +++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/Task.java @@ -30,6 +30,7 @@ import org.apache.baremaps.workflow.tasks.*; @JsonSubTypes({@JsonSubTypes.Type(value = DownloadUrl.class, name = "DownloadUrl"), @JsonSubTypes.Type(value = ExecuteCommand.class, name = "ExecuteCommand"), @JsonSubTypes.Type(value = ExecuteSql.class, name = "ExecuteSql"), + @JsonSubTypes.Type(value = ExecuteSqlScript.class, name = "ExecuteSqlScript"), @JsonSubTypes.Type(value = ExportVectorTiles.class, name = "ExportVectorTiles"), @JsonSubTypes.Type(value = ImportGeoPackage.class, name = "ImportGeoPackage"), @JsonSubTypes.Type(value = ImportOpenStreetMap.class, name = "ImportOpenStreetMap"), diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ExecuteSql.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ExecuteSql.java index 306ef5fb..95af43e4 100644 --- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ExecuteSql.java +++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ExecuteSql.java @@ -34,8 +34,9 @@ public record ExecuteSql(String database, Path file, boolean parallel) implement queries.forEach( query -> { var dataSource = context.getDataSource(database); - try (var connection = dataSource.getConnection()) { - connection.createStatement().execute(query); + try (var connection = dataSource.getConnection(); + var statement = connection.createStatement()) { + statement.execute(query); } catch (SQLException e) { throw new WorkflowException(e); } diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ExecuteSqlScript.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ExecuteSqlScript.java new file mode 100644 index 00000000..168433b9 --- /dev/null +++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ExecuteSqlScript.java @@ -0,0 +1,37 @@ +/* + * 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. + */ + +package org.apache.baremaps.workflow.tasks; + +import org.apache.baremaps.workflow.Task; +import org.apache.baremaps.workflow.WorkflowContext; +import org.apache.baremaps.workflow.WorkflowException; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.sql.SQLException; + +public record ExecuteSqlScript(String database, Path file) implements Task { + + @Override + public void execute(WorkflowContext context) throws Exception { + var script = Files.readString(file); + var dataSource = context.getDataSource(database); + try (var connection = dataSource.getConnection(); + var statement = connection.createStatement()) { + statement.execute(script); + } catch (SQLException e) { + throw new WorkflowException(e); + } + } + +} diff --git a/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/ExecuteSqlScriptTest.java b/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/ExecuteSqlScriptTest.java new file mode 100644 index 00000000..0d6de566 --- /dev/null +++ b/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/ExecuteSqlScriptTest.java @@ -0,0 +1,31 @@ +/* + * 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. + */ + +package org.apache.baremaps.workflow.tasks; + + + +import org.apache.baremaps.testing.PostgresContainerTest; +import org.apache.baremaps.testing.TestFiles; +import org.apache.baremaps.workflow.WorkflowContext; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +class ExecuteSqlScriptTest extends PostgresContainerTest { + + @Test + @Tag("integration") + void execute() throws Exception { + var task = new ExecuteSqlScript(jdbcUrl(), TestFiles.resolve("script.sql")); + task.execute(new WorkflowContext()); + } +} diff --git a/baremaps-core/src/test/resources/script.sql b/baremaps-core/src/test/resources/script.sql new file mode 100644 index 00000000..4577e1e1 --- /dev/null +++ b/baremaps-core/src/test/resources/script.sql @@ -0,0 +1,5 @@ +DO $$ + BEGIN + PERFORM 'Hello, World!'; + END +$$; \ No newline at end of file
