Skip to content

Commit 2d6cc0b

Browse files
committed
Introduce quarkus.datasource.devservices.init-script-path
- This enables specifying a SQL initialization script for Dev Services Databases Added tests
1 parent 1d30c00 commit 2d6cc0b

File tree

11 files changed

+67
-3
lines changed

11 files changed

+67
-3
lines changed

extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceContainerConfig.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class DevServicesDatasourceContainerConfig {
1414
private final Optional<String> dbName;
1515
private final Optional<String> username;
1616
private final Optional<String> password;
17+
private final Optional<String> initScriptPath;
1718

1819
public DevServicesDatasourceContainerConfig(Optional<String> imageName,
1920
Map<String, String> containerProperties,
@@ -22,7 +23,8 @@ public DevServicesDatasourceContainerConfig(Optional<String> imageName,
2223
Optional<String> command,
2324
Optional<String> dbName,
2425
Optional<String> username,
25-
Optional<String> password) {
26+
Optional<String> password,
27+
Optional<String> initScriptPath) {
2628
this.imageName = imageName;
2729
this.containerProperties = containerProperties;
2830
this.additionalJdbcUrlProperties = additionalJdbcUrlProperties;
@@ -31,6 +33,7 @@ public DevServicesDatasourceContainerConfig(Optional<String> imageName,
3133
this.dbName = dbName;
3234
this.username = username;
3335
this.password = password;
36+
this.initScriptPath = initScriptPath;
3437
}
3538

3639
public Optional<String> getImageName() {
@@ -64,4 +67,8 @@ public Optional<String> getUsername() {
6467
public Optional<String> getPassword() {
6568
return password;
6669
}
70+
71+
public Optional<String> getInitScriptPath() {
72+
return initScriptPath;
73+
}
6774
}

extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@ private RunningDevService startDevDb(String dbName,
275275
dataSourceBuildTimeConfig.devservices.command,
276276
dataSourceBuildTimeConfig.devservices.dbName,
277277
dataSourceBuildTimeConfig.devservices.username,
278-
dataSourceBuildTimeConfig.devservices.password);
278+
dataSourceBuildTimeConfig.devservices.password,
279+
dataSourceBuildTimeConfig.devservices.initScriptPath);
279280

280281
DevServicesDatasourceProvider.RunningDevServicesDatasource datasource = devDbProvider
281282
.startDatabase(

extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java

+8
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,12 @@ public class DevServicesBuildTimeConfig {
7676
*/
7777
@ConfigItem
7878
public Optional<String> password;
79+
80+
/**
81+
* Path to a SQL script that will be loaded from the classpath and applied to the Dev Service database
82+
*
83+
* If the provider is not container based (e.g. a H2 or Derby Database) then this has no effect.
84+
*/
85+
@ConfigItem
86+
public Optional<String> initScriptPath;
7987
}

extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
5353

5454
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
5555
containerConfig.getCommand().ifPresent(container::setCommand);
56+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
5657
container.start();
5758

5859
LOG.info("Dev Services for IBM Db2 started.");

extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6161

6262
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6363
containerConfig.getCommand().ifPresent(container::setCommand);
64+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6465

6566
container.start();
6667

extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
4949

5050
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
5151
containerConfig.getCommand().ifPresent(container::setCommand);
52+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
5253

5354
container.start();
5455

extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6060

6161
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6262
containerConfig.getCommand().ifPresent(container::setCommand);
63+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6364

6465
container.start();
6566

extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6363

6464
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6565
containerConfig.getCommand().ifPresent(container::setCommand);
66+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6667

6768
container.start();
6869

extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
4747
containerConfig.getFixedExposedPort(),
4848
!devServicesSharedNetworkBuildItem.isEmpty());
4949
startupTimeout.ifPresent(container::withStartupTimeout);
50-
5150
String effectiveUsername = containerConfig.getUsername().orElse(username.orElse(DEFAULT_DATABASE_USERNAME));
5251
String effectivePassword = containerConfig.getPassword().orElse(password.orElse(DEFAULT_DATABASE_PASSWORD));
5352
String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME));
@@ -60,6 +59,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6059

6160
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6261
containerConfig.getCommand().ifPresent(container::setCommand);
62+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6363

6464
container.start();
6565

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.quarkus.jdbc.postgresql.deployment;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.sql.CallableStatement;
6+
import java.sql.Connection;
7+
import java.sql.ResultSet;
8+
9+
import javax.inject.Inject;
10+
import javax.sql.DataSource;
11+
12+
import org.junit.jupiter.api.DisplayName;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.RegisterExtension;
15+
16+
import io.quarkus.test.QuarkusUnitTest;
17+
18+
public class DevServicesPostgresqlDatasourceWithInitScriptTestCase {
19+
20+
@RegisterExtension
21+
static QuarkusUnitTest test = new QuarkusUnitTest()
22+
.withApplicationRoot(javaArchive -> javaArchive.addAsResource("init-db.sql"))
23+
.overrideConfigKey("quarkus.datasource.db-kind", "postgresql")
24+
.overrideConfigKey("quarkus.datasource.devservices.init-script-path", "init-db.sql");
25+
26+
@Inject
27+
DataSource ds;
28+
29+
@Test
30+
@DisplayName("Test if init-sql-path executed successfully")
31+
public void testDatasource() throws Exception {
32+
int result = 0;
33+
try (Connection con = ds.getConnection();
34+
CallableStatement cs = con.prepareCall("SELECT my_func()");
35+
ResultSet rs = cs.executeQuery()) {
36+
if (rs.next()) {
37+
result = rs.getInt(1);
38+
}
39+
}
40+
assertEquals(100, result, "The init script should have been executed");
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CREATE OR REPLACE FUNCTION my_func() RETURNS integer LANGUAGE plpgsql as $func$ BEGIN return 100; END $func$;

0 commit comments

Comments
 (0)