Skip to content

Commit 3c8e9a6

Browse files
authored
Merge pull request #122 from ebean-orm/feature/programmatic-extra2-database
Support programmatic configuration of a 2nd extra database with Postgres
2 parents 4b7007d + 07c4380 commit 3c8e9a6

16 files changed

+322
-173
lines changed

src/main/java/io/ebean/test/containers/BaseBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ protected String buildJdbcUrl() {
335335
/**
336336
* Override to build jdbc url for extraDb.
337337
*/
338-
protected String buildExtraJdbcUrl() {
338+
protected String buildExtraJdbcUrl(String dbName) {
339339
throw new IllegalStateException("Not valid for this type");
340340
}
341341

@@ -396,8 +396,8 @@ public String jdbcUrl() {
396396
}
397397

398398
@Override
399-
public String jdbcExtraUrl() {
400-
return buildExtraJdbcUrl();
399+
public String jdbcUrl(String dbName) {
400+
return buildExtraJdbcUrl(dbName);
401401
}
402402

403403
@Override

src/main/java/io/ebean/test/containers/BaseDbBuilder.java

Lines changed: 27 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.sql.DriverManager;
55
import java.sql.SQLException;
66
import java.util.Properties;
7+
import java.util.function.Consumer;
78

89
/**
910
* Configuration for an DBMS like Postgres, MySql, Oracle, SQLServer
@@ -25,15 +26,8 @@ abstract class BaseDbBuilder<C, SELF extends BaseDbBuilder<C, SELF>> extends Bas
2526
*/
2627
String adminPassword = "admin";
2728

28-
/**
29-
* An additional database.
30-
*/
31-
String extraDb;
32-
private String extraDbUser;
33-
private String extraDbPassword = "test";
34-
String extraDbExtensions;
35-
private String extraDbInitSqlFile;
36-
private String extraDbSeedSqlFile;
29+
final ExtraAttributes extra = new ExtraAttributes();
30+
final ExtraAttributes extra2 = new ExtraAttributes();
3731

3832
/**
3933
* Database name to use.
@@ -123,13 +117,8 @@ public SELF properties(Properties properties) {
123117
adminPassword = prop(properties, "adminPassword", adminPassword);
124118
initSqlFile = prop(properties, "initSqlFile", initSqlFile);
125119
seedSqlFile = prop(properties, "seedSqlFile", seedSqlFile);
126-
127-
extraDb = prop(properties, "extraDb.dbName", prop(properties, "extraDb", extraDb));
128-
extraDbUser = prop(properties, "extraDb.username", extraDbUser);
129-
extraDbPassword = prop(properties, "extraDb.password", extraDbPassword);
130-
extraDbExtensions = prop(properties, "extraDb.extensions", extraDbExtensions);
131-
extraDbInitSqlFile = prop(properties, "extraDb.initSqlFile", extraDbInitSqlFile);
132-
extraDbSeedSqlFile = prop(properties, "extraDb.seedSqlFile", extraDbSeedSqlFile);
120+
extra.load(platform, "extraDb", properties);
121+
extra2.load(platform, "extra2Db", properties);
133122
return self();
134123
}
135124

@@ -270,7 +259,7 @@ public SELF seedSqlFile(String seedSqlFile) {
270259
*/
271260
@Override
272261
public SELF extraDb(String extraDb) {
273-
this.extraDb = extraDb;
262+
this.extra.dbName = extraDb;
274263
return self();
275264
}
276265

@@ -282,7 +271,7 @@ public SELF extraDb(String extraDb) {
282271
*/
283272
@Override
284273
public SELF extraDbUser(String extraDbUser) {
285-
this.extraDbUser = extraDbUser;
274+
this.extra.username = extraDbUser;
286275
return self();
287276
}
288277

@@ -294,13 +283,13 @@ public SELF extraDbUser(String extraDbUser) {
294283
*/
295284
@Override
296285
public SELF extraDbPassword(String extraDbPassword) {
297-
this.extraDbPassword = extraDbPassword;
286+
this.extra.password = extraDbPassword;
298287
return self();
299288
}
300289

301290
@Override
302291
public SELF extraDbExtensions(String extraDbExtensions) {
303-
this.extraDbExtensions = extraDbExtensions;
292+
this.extra.extensions = extraDbExtensions;
304293
return self();
305294
}
306295

@@ -309,7 +298,7 @@ public SELF extraDbExtensions(String extraDbExtensions) {
309298
*/
310299
@Override
311300
public SELF extraDbInitSqlFile(String extraDbInitSqlFile) {
312-
this.extraDbInitSqlFile = extraDbInitSqlFile;
301+
this.extra.initSqlFile = extraDbInitSqlFile;
313302
return self();
314303
}
315304

@@ -318,7 +307,19 @@ public SELF extraDbInitSqlFile(String extraDbInitSqlFile) {
318307
*/
319308
@Override
320309
public SELF extraDbSeedSqlFile(String extraDbSeedSqlFile) {
321-
this.extraDbSeedSqlFile = extraDbSeedSqlFile;
310+
this.extra.seedSqlFile = extraDbSeedSqlFile;
311+
return self();
312+
}
313+
314+
@Override
315+
public SELF extra(Consumer<ExtraBuilder> extraBuilder) {
316+
extraBuilder.accept(extra);
317+
return self();
318+
}
319+
320+
@Override
321+
public SELF extra2(Consumer<ExtraBuilder> extraBuilder) {
322+
extraBuilder.accept(extra2);
322323
return self();
323324
}
324325

@@ -469,43 +470,13 @@ public String getSeedSqlFile() {
469470
}
470471

471472
@Override
472-
public String getExtraDb() {
473-
return extraDb;
474-
}
475-
476-
@Override
477-
public String getExtraDbUser() {
478-
return extraDbUser;
479-
}
480-
481-
@Override
482-
public String getExtraDbUserWithDefault() {
483-
return extraDbUser != null ? extraDbUser : extraDb;
484-
}
485-
486-
@Override
487-
public String getExtraDbPassword() {
488-
return extraDbPassword;
489-
}
490-
491-
@Override
492-
public String getExtraDbPasswordWithDefault() {
493-
return extraDbPassword != null ? extraDbPassword : password;
494-
}
495-
496-
@Override
497-
public String getExtraDbExtensions() {
498-
return extraDbExtensions;
499-
}
500-
501-
@Override
502-
public String getExtraDbInitSqlFile() {
503-
return extraDbInitSqlFile;
473+
public ExtraAttributes extra() {
474+
return extra;
504475
}
505476

506477
@Override
507-
public String getExtraDbSeedSqlFile() {
508-
return extraDbSeedSqlFile;
478+
public ExtraAttributes extra2() {
479+
return extra2;
509480
}
510481

511482
@Override

src/main/java/io/ebean/test/containers/BaseMySqlContainer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ private void createRoleAndDatabase(boolean withDrop) {
2727
if (withDrop) {
2828
dropUserIfExists(connection, dbConfig.getUsername());
2929
dropDatabaseIfExists(connection, dbConfig.getDbName());
30-
for (String extraDb : toDatabaseNames(dbConfig.getExtraDb())) {
30+
for (String extraDb : toDatabaseNames(dbConfig.extra().dbName())) {
3131
dropDatabaseIfExists(connection, extraDb);
3232
}
3333
}
@@ -55,7 +55,7 @@ private void createUser(Connection connection) {
5555
if (!userExists(connection, dbConfig.getUsername())) {
5656
sqlRun(connection, "create user '" + dbConfig.getUsername() + "'@'%' identified by '" + dbConfig.getPassword() + "'");
5757
sqlRun(connection, "grant all on " + dbConfig.getDbName() + ".* to '" + dbConfig.getUsername() + "'@'%'");
58-
for (String extraDb : toDatabaseNames(dbConfig.getExtraDb())) {
58+
for (String extraDb : toDatabaseNames(dbConfig.extra().dbName())) {
5959
sqlRun(connection, "grant all on " + extraDb + ".* to '" + dbConfig.getUsername() + "'@'%'");
6060
}
6161
}
@@ -72,7 +72,7 @@ private void createDatabase(Connection connection) {
7272
}
7373

7474
private void createExtraDatabases(Connection connection) {
75-
for (String extraDb : toDatabaseNames(dbConfig.getExtraDb())) {
75+
for (String extraDb : toDatabaseNames(dbConfig.extra().dbName())) {
7676
createDatabase(connection, extraDb);
7777
}
7878
}

src/main/java/io/ebean/test/containers/BasePostgresContainer.java

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,34 +33,42 @@ private void createRoleAndDatabase(boolean withDrop) {
3333
dropRoleIfExists(connection, dbConfig.getUsername());
3434
}
3535
if (databaseNotExists(connection, dbConfig.getDbName())) {
36-
createExtraDb(connection, withDrop);
3736
createRole(connection);
3837
createDatabase(connection);
38+
createExtraDb(connection, withDrop, dbConfig.extra());
39+
createExtraDb(connection, withDrop, dbConfig.extra2());
3940
}
4041
} catch (SQLException e) {
4142
throw new RuntimeException("Error when creating database and role", e);
4243
}
4344
}
4445

4546
private void dropRoleIfExists(Connection connection, String username) {
46-
sqlRun(connection, "drop role if exists " + username);
47+
if (defined(username)) {
48+
sqlRun(connection, "drop role if exists " + username);
49+
}
4750
}
4851

4952
private void dropDatabaseIfExists(Connection connection, String dbName) {
50-
sqlRun(connection, "drop database if exists " + dbName);
53+
if (defined(dbName)) {
54+
sqlRun(connection, "drop database if exists " + dbName);
55+
}
5156
}
5257

53-
private void createExtraDb(Connection connection, boolean withDrop) {
54-
final String extraUser = getExtraDbUser();
58+
private void createExtraDb(Connection connection, boolean withDrop, ExtraAttributes extra) {
59+
final String extraDb = extra.dbName();
60+
if (!defined(extraDb)) {
61+
return;
62+
}
63+
final String extraUser = extra.userWithDefaults(dbConfig.getUsername());
5564
if (defined(extraUser)) {
56-
final String extraDb = dbConfig.getExtraDb();
5765
if (withDrop) {
5866
dropDatabaseIfExists(connection, extraDb);
5967
dropRoleIfExists(connection, extraUser);
6068
}
61-
createRole(connection, extraUser, dbConfig.getExtraDbPasswordWithDefault());
69+
createRole(connection, extraUser, extra.passwordWithDefault(dbConfig.getPassword()));
6270
if (databaseNotExists(connection, extraDb)) {
63-
createExtraDatabase(connection, extraDb, extraUser);
71+
createExtraDatabase(connection, extraDb, extraUser, extra);
6472
}
6573
}
6674
}
@@ -71,28 +79,37 @@ private void createDatabase(Connection connection) {
7179
createDatabaseInitSql(dbConfig.getDbName(), dbConfig.getUsername(), dbConfig.getInitSqlFile(), dbConfig.getSeedSqlFile());
7280
}
7381

74-
private void createExtraDatabase(Connection connection, String extraDb, String extraUser) {
75-
createDatabaseWithOwner(connection, extraDb, extraUser);
76-
addExtensions(dbConfig.getExtraDbExtensions(), dbConfig.jdbcExtraUrl());
77-
createDatabaseInitSql(extraDb, extraUser, dbConfig.getExtraDbInitSqlFile(), dbConfig.getExtraDbSeedSqlFile());
82+
private void createExtraDatabase(Connection connection, String dbName, String username, ExtraAttributes attrs) {
83+
createDatabaseWithOwner(connection, dbName, username);
84+
addExtensions(attrs.extensions(), dbConfig.jdbcUrl(dbName));
85+
createDatabaseInitSql(dbName, username, attrs);
7886
}
7987

8088
private void createRole(Connection connection) {
8189
createRole(connection, dbConfig.getUsername(), dbConfig.getPassword());
8290
}
8391

8492
private void createRole(Connection connection, String username, String password) {
85-
if (!sqlHasRow(connection, "select rolname from pg_roles where rolname = '" + username + "'")) {
93+
if (defined(username) && !sqlHasRow(connection, "select rolname from pg_roles where rolname = '" + username + "'")) {
8694
sqlRun(connection, "create role " + username + " password '" + password + "' login createrole superuser");
8795
}
8896
}
8997

9098
private boolean databaseNotExists(Connection connection, String dbName) {
99+
if (!defined(dbName)) {
100+
return false;
101+
}
91102
return !sqlHasRow(connection, "select 1 from pg_database where datname = '" + dbName + "'");
92103
}
93104

94105
private void createDatabaseWithOwner(Connection connection, String dbName, String owner) {
95-
sqlRun(connection, "create database " + dbName + " with owner " + owner);
106+
if (defined(dbName) && defined(owner)) {
107+
sqlRun(connection, "create database " + dbName + " with owner " + owner);
108+
}
109+
}
110+
111+
private void createDatabaseInitSql(String extraDb, String extraUser, ExtraAttributes attrs) {
112+
createDatabaseInitSql(extraDb, extraUser, attrs.initSqlFile(), attrs.seedSqlFile());
96113
}
97114

98115
private void createDatabaseInitSql(String dbName, String owner, String initSql, String seedSql) {
@@ -120,17 +137,6 @@ private void addExtensions(String dbExtensions, String jdbcUrl) {
120137
}
121138
}
122139

123-
/**
124-
* Maybe return an extra user to create.
125-
* <p>
126-
* The extra user will default to be the same as the extraDB if that is defined.
127-
* Additionally we don't create an extra user IF it is the same as the main db user.
128-
*/
129-
private String getExtraDbUser() {
130-
String extraUser = dbConfig.getExtraDbUserWithDefault();
131-
return extraUser != null && !extraUser.equals(dbConfig.getUsername()) ? extraUser : null;
132-
}
133-
134140
@Override
135141
protected void executeSqlFile(String dbUser, String dbName, String containerFilePath) {
136142
ProcessBuilder pb = sqlFileProcess(dbUser, dbName, containerFilePath);

src/main/java/io/ebean/test/containers/ContainerBuilderDb.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.ebean.test.containers;
22

3+
import java.util.function.Consumer;
4+
35
/**
46
* Builder for DB containers.
57
*/
@@ -95,6 +97,16 @@ public interface ContainerBuilderDb<C, SELF extends ContainerBuilderDb<C, SELF>>
9597
*/
9698
SELF extraDbSeedSqlFile(String extraDbSeedSqlFile);
9799

100+
/**
101+
* Create an additional extra database with the given attributes.
102+
*/
103+
SELF extra(Consumer<ExtraBuilder> extraBuilder);
104+
105+
/**
106+
* Create a second additional extra database with the given attributes.
107+
*/
108+
SELF extra2(Consumer<ExtraBuilder> extraBuilder);
109+
98110
/**
99111
* Set to true to use in-memory database if supported.
100112
*/

src/main/java/io/ebean/test/containers/ContainerConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public interface ContainerConfig {
3939
/**
4040
* Return a DB connection url or null for the extra database.
4141
*/
42-
String jdbcExtraUrl();
42+
String jdbcUrl(String dbName);
4343

4444
/**
4545
* Return a DB connection url for the admin database user.

0 commit comments

Comments
 (0)