diff --git a/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceContainerConfig.java b/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceContainerConfig.java index 4c68beb42f42c..abba376e6eaf0 100644 --- a/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceContainerConfig.java +++ b/extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceContainerConfig.java @@ -14,6 +14,7 @@ public class DevServicesDatasourceContainerConfig { private final Optional dbName; private final Optional username; private final Optional password; + private final Optional initScriptPath; public DevServicesDatasourceContainerConfig(Optional imageName, Map containerProperties, @@ -22,7 +23,8 @@ public DevServicesDatasourceContainerConfig(Optional imageName, Optional command, Optional dbName, Optional username, - Optional password) { + Optional password, + Optional initScriptPath) { this.imageName = imageName; this.containerProperties = containerProperties; this.additionalJdbcUrlProperties = additionalJdbcUrlProperties; @@ -31,6 +33,7 @@ public DevServicesDatasourceContainerConfig(Optional imageName, this.dbName = dbName; this.username = username; this.password = password; + this.initScriptPath = initScriptPath; } public Optional getImageName() { @@ -64,4 +67,8 @@ public Optional getUsername() { public Optional getPassword() { return password; } + + public Optional getInitScriptPath() { + return initScriptPath; + } } diff --git a/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java b/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java index f10a51ffe2f2e..65bc997799ab9 100644 --- a/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java +++ b/extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java @@ -275,7 +275,8 @@ private RunningDevService startDevDb(String dbName, dataSourceBuildTimeConfig.devservices.command, dataSourceBuildTimeConfig.devservices.dbName, dataSourceBuildTimeConfig.devservices.username, - dataSourceBuildTimeConfig.devservices.password); + dataSourceBuildTimeConfig.devservices.password, + dataSourceBuildTimeConfig.devservices.initScriptPath); DevServicesDatasourceProvider.RunningDevServicesDatasource datasource = devDbProvider .startDatabase( diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java index f36be4a686c69..9a2e33823e824 100644 --- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java +++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java @@ -76,4 +76,12 @@ public class DevServicesBuildTimeConfig { */ @ConfigItem public Optional password; + + /** + * Path to a SQL script that will be loaded from the classpath and applied to the Dev Service database + * + * If the provider is not container based (e.g. a H2 or Derby Database) then this has no effect. + */ + @ConfigItem + public Optional initScriptPath; } diff --git a/extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java b/extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java index 1e03cab907eca..de239be3b9d4c 100644 --- a/extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java +++ b/extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java @@ -53,6 +53,7 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam); containerConfig.getCommand().ifPresent(container::setCommand); + containerConfig.getInitScriptPath().ifPresent(container::withInitScript); container.start(); LOG.info("Dev Services for IBM Db2 started."); diff --git a/extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java b/extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java index 3668d11dcfee4..c308925a2d671 100644 --- a/extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java +++ b/extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java @@ -61,6 +61,7 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam); containerConfig.getCommand().ifPresent(container::setCommand); + containerConfig.getInitScriptPath().ifPresent(container::withInitScript); container.start(); diff --git a/extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java b/extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java index ea7983b8dcf1c..5f133ae371ff6 100644 --- a/extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java +++ b/extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java @@ -49,6 +49,7 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam); containerConfig.getCommand().ifPresent(container::setCommand); + containerConfig.getInitScriptPath().ifPresent(container::withInitScript); container.start(); diff --git a/extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java b/extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java index b5fb64d81b4e5..41d62223c327b 100644 --- a/extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java +++ b/extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java @@ -60,6 +60,7 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam); containerConfig.getCommand().ifPresent(container::setCommand); + containerConfig.getInitScriptPath().ifPresent(container::withInitScript); container.start(); diff --git a/extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java b/extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java index 29c5400efb343..fa4ff0f5766dc 100644 --- a/extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java +++ b/extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java @@ -63,6 +63,7 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam); containerConfig.getCommand().ifPresent(container::setCommand); + containerConfig.getInitScriptPath().ifPresent(container::withInitScript); container.start(); diff --git a/extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java b/extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java index 28b0c10ab25ea..a4c9c9bf1c224 100644 --- a/extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java +++ b/extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java @@ -60,6 +60,7 @@ public RunningDevServicesDatasource startDatabase(Optional username, Opt containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam); containerConfig.getCommand().ifPresent(container::setCommand); + containerConfig.getInitScriptPath().ifPresent(container::withInitScript); container.start(); diff --git a/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/DevServicesPostgresqlDatasourceWithInitScriptTestCase.java b/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/DevServicesPostgresqlDatasourceWithInitScriptTestCase.java new file mode 100644 index 0000000000000..7e1bab5f32c10 --- /dev/null +++ b/extensions/jdbc/jdbc-postgresql/deployment/src/test/java/io/quarkus/jdbc/postgresql/deployment/DevServicesPostgresqlDatasourceWithInitScriptTestCase.java @@ -0,0 +1,42 @@ +package io.quarkus.jdbc.postgresql.deployment; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.ResultSet; + +import javax.inject.Inject; +import javax.sql.DataSource; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; + +public class DevServicesPostgresqlDatasourceWithInitScriptTestCase { + + @RegisterExtension + static QuarkusUnitTest test = new QuarkusUnitTest() + .withApplicationRoot(javaArchive -> javaArchive.addAsResource("init-db.sql")) + .overrideConfigKey("quarkus.datasource.db-kind", "postgresql") + .overrideConfigKey("quarkus.datasource.devservices.init-script-path", "init-db.sql"); + + @Inject + DataSource ds; + + @Test + @DisplayName("Test if init-script-path executed successfully") + public void testDatasource() throws Exception { + int result = 0; + try (Connection con = ds.getConnection(); + CallableStatement cs = con.prepareCall("SELECT my_func()"); + ResultSet rs = cs.executeQuery()) { + if (rs.next()) { + result = rs.getInt(1); + } + } + assertEquals(100, result, "The init script should have been executed"); + } +} diff --git a/extensions/jdbc/jdbc-postgresql/deployment/src/test/resources/init-db.sql b/extensions/jdbc/jdbc-postgresql/deployment/src/test/resources/init-db.sql new file mode 100644 index 0000000000000..3c2dd9de15b49 --- /dev/null +++ b/extensions/jdbc/jdbc-postgresql/deployment/src/test/resources/init-db.sql @@ -0,0 +1 @@ +CREATE OR REPLACE FUNCTION my_func() RETURNS integer LANGUAGE plpgsql as $func$ BEGIN return 100; END $func$; \ No newline at end of file