Skip to content

Commit dbd7d3a

Browse files
committed
Add option to enable createDatabaseIfNotExist
1 parent 093b0cb commit dbd7d3a

File tree

4 files changed

+64
-23
lines changed

4 files changed

+64
-23
lines changed

src/main/java/io/asyncer/r2dbc/mysql/MySqlConnectionConfiguration.java

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ public final class MySqlConnectionConfiguration {
8484

8585
private final String database;
8686

87+
private final boolean createDatabaseIfNotExist;
88+
8789
@Nullable
8890
private final Predicate<String> preferPrepareStatement;
8991

@@ -96,12 +98,15 @@ public final class MySqlConnectionConfiguration {
9698
@Nullable
9799
private final Publisher<String> passwordPublisher;
98100

99-
private MySqlConnectionConfiguration(boolean isHost, String domain, int port, MySqlSslConfiguration ssl,
101+
private MySqlConnectionConfiguration(
102+
boolean isHost, String domain, int port, MySqlSslConfiguration ssl,
100103
boolean tcpKeepAlive, boolean tcpNoDelay, @Nullable Duration connectTimeout,
101104
@Nullable Duration socketTimeout, ZeroDateOption zeroDateOption, @Nullable ZoneId serverZoneId,
102105
String user, @Nullable CharSequence password, @Nullable String database,
103-
@Nullable Predicate<String> preferPrepareStatement, int queryCacheSize, int prepareCacheSize,
104-
Extensions extensions, @Nullable Publisher<String> passwordPublisher) {
106+
boolean createDatabaseIfNotExist, @Nullable Predicate<String> preferPrepareStatement,
107+
int queryCacheSize, int prepareCacheSize, Extensions extensions,
108+
@Nullable Publisher<String> passwordPublisher
109+
) {
105110
this.isHost = isHost;
106111
this.domain = domain;
107112
this.port = port;
@@ -115,6 +120,7 @@ private MySqlConnectionConfiguration(boolean isHost, String domain, int port, My
115120
this.user = requireNonNull(user, "user must not be null");
116121
this.password = password;
117122
this.database = database == null || database.isEmpty() ? "" : database;
123+
this.createDatabaseIfNotExist = createDatabaseIfNotExist;
118124
this.preferPrepareStatement = preferPrepareStatement;
119125
this.queryCacheSize = queryCacheSize;
120126
this.prepareCacheSize = prepareCacheSize;
@@ -192,6 +198,10 @@ String getDatabase() {
192198
return database;
193199
}
194200

201+
boolean isCreateDatabaseIfNotExist() {
202+
return createDatabaseIfNotExist;
203+
}
204+
195205
@Nullable
196206
Predicate<String> getPreferPrepareStatement() {
197207
return preferPrepareStatement;
@@ -236,6 +246,7 @@ public boolean equals(Object o) {
236246
user.equals(that.user) &&
237247
Objects.equals(password, that.password) &&
238248
database.equals(that.database) &&
249+
createDatabaseIfNotExist == that.createDatabaseIfNotExist &&
239250
Objects.equals(preferPrepareStatement, that.preferPrepareStatement) &&
240251
queryCacheSize == that.queryCacheSize &&
241252
prepareCacheSize == that.prepareCacheSize &&
@@ -245,29 +256,31 @@ public boolean equals(Object o) {
245256

246257
@Override
247258
public int hashCode() {
248-
return Objects.hash(isHost, domain, port, ssl, tcpKeepAlive, tcpNoDelay,
249-
connectTimeout, socketTimeout, serverZoneId, zeroDateOption, user, password, database,
250-
preferPrepareStatement, queryCacheSize, prepareCacheSize, extensions, passwordPublisher);
259+
return Objects.hash(isHost, domain, port, ssl, tcpKeepAlive, tcpNoDelay, connectTimeout,
260+
socketTimeout, serverZoneId, zeroDateOption, user, password, database, createDatabaseIfNotExist,
261+
preferPrepareStatement, queryCacheSize, prepareCacheSize, extensions, passwordPublisher);
251262
}
252263

253264
@Override
254265
public String toString() {
255266
if (isHost) {
256-
return "MySqlConnectionConfiguration{, host='" + domain + "', port=" + port + ", ssl=" + ssl +
257-
", tcpNoDelay=" + tcpNoDelay + ", tcpKeepAlive=" + tcpKeepAlive + ", connectTimeout=" +
258-
connectTimeout + ", socketTimeout=" + socketTimeout + ", serverZoneId=" + serverZoneId +
259-
", zeroDateOption=" + zeroDateOption + ", user='" + user + '\'' + ", password=" + password +
260-
", database='" + database + "', preferPrepareStatement=" + preferPrepareStatement +
261-
", queryCacheSize=" + queryCacheSize + ", prepareCacheSize=" + prepareCacheSize +
262-
", extensions=" + extensions + ", passwordPublisher=" + passwordPublisher + '}';
263-
}
264-
265-
return "MySqlConnectionConfiguration{, unixSocket='" + domain + "', connectTimeout=" +
266-
connectTimeout + ", socketTimeout=" + socketTimeout + ", serverZoneId=" + serverZoneId +
267-
", zeroDateOption=" + zeroDateOption + ", user='" + user + "', password=" + password +
268-
", database='" + database + "', preferPrepareStatement=" + preferPrepareStatement +
269-
", queryCacheSize=" + queryCacheSize + ", prepareCacheSize=" + prepareCacheSize +
270-
", extensions=" + extensions + ", passwordPublisher=" + passwordPublisher + '}';
267+
return "MySqlConnectionConfiguration{host='" + domain + "', port=" + port + ", ssl=" + ssl +
268+
", tcpNoDelay=" + tcpNoDelay + ", tcpKeepAlive=" + tcpKeepAlive + ", connectTimeout=" +
269+
connectTimeout + ", socketTimeout=" + socketTimeout + ", serverZoneId=" + serverZoneId +
270+
", zeroDateOption=" + zeroDateOption + ", user='" + user + "', password=" + password +
271+
", database='" + database + "', createDatabaseIfNotExist=" + createDatabaseIfNotExist +
272+
", preferPrepareStatement=" + preferPrepareStatement + ", queryCacheSize=" + queryCacheSize +
273+
", prepareCacheSize=" + prepareCacheSize + ", extensions=" + extensions +
274+
", passwordPublisher=" + passwordPublisher + '}';
275+
}
276+
277+
return "MySqlConnectionConfiguration{unixSocket='" + domain + "', connectTimeout=" +
278+
connectTimeout + ", socketTimeout=" + socketTimeout + ", serverZoneId=" + serverZoneId +
279+
", zeroDateOption=" + zeroDateOption + ", user='" + user + "', password=" + password +
280+
", database='" + database + "', createDatabaseIfNotExist=" + createDatabaseIfNotExist +
281+
", preferPrepareStatement=" + preferPrepareStatement + ", queryCacheSize=" + queryCacheSize +
282+
", prepareCacheSize=" + prepareCacheSize + ", extensions=" + extensions +
283+
", passwordPublisher=" + passwordPublisher + '}';
271284
}
272285

273286
/**
@@ -278,6 +291,8 @@ public static final class Builder {
278291
@Nullable
279292
private String database;
280293

294+
private boolean createDatabaseIfNotExist;
295+
281296
private boolean isHost = true;
282297

283298
private String domain;
@@ -364,7 +379,7 @@ public MySqlConnectionConfiguration build() {
364379
sslCa, sslKey, sslKeyPassword, sslCert, sslContextBuilderCustomizer);
365380
return new MySqlConnectionConfiguration(isHost, domain, port, ssl, tcpKeepAlive, tcpNoDelay,
366381
connectTimeout, socketTimeout, zeroDateOption, serverZoneId, user, password, database,
367-
preferPrepareStatement, queryCacheSize, prepareCacheSize,
382+
createDatabaseIfNotExist, preferPrepareStatement, queryCacheSize, prepareCacheSize,
368383
Extensions.from(extensions, autodetectExtensions), passwordPublisher);
369384
}
370385

@@ -380,6 +395,19 @@ public Builder database(@Nullable String database) {
380395
return this;
381396
}
382397

398+
/**
399+
* Configure to create the database given in the configuration if it does not yet exist. Default to
400+
* {@code false}.
401+
*
402+
* @param enabled to discover and register extensions.
403+
* @return this {@link Builder}.
404+
* @since 1.0.6
405+
*/
406+
public Builder createDatabaseIfNotExist(boolean enabled) {
407+
this.createDatabaseIfNotExist = enabled;
408+
return this;
409+
}
410+
383411
/**
384412
* Configure the Unix Domain Socket to connect to.
385413
*

src/main/java/io/asyncer/r2dbc/mysql/MySqlConnectionFactoryProvider.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,14 @@ public final class MySqlConnectionFactoryProvider implements ConnectionFactoryPr
162162
*/
163163
public static final Option<Boolean> TCP_NO_DELAY = Option.valueOf("tcpNoDelay");
164164

165+
/**
166+
* Enable/Disable database creation if not exist.
167+
*
168+
* @since 1.0.6
169+
*/
170+
public static final Option<Boolean> CREATE_DATABASE_IF_NOT_EXIST =
171+
Option.valueOf("createDatabaseIfNotExist");
172+
165173
/**
166174
* Enable server preparing for parametrized statements and prefer server preparing simple statements.
167175
* <p>
@@ -270,8 +278,10 @@ static MySqlConnectionConfiguration setup(ConnectionFactoryOptions options) {
270278
.to(builder::socketTimeout);
271279
mapper.optional(DATABASE).asString()
272280
.to(builder::database);
281+
mapper.optional(CREATE_DATABASE_IF_NOT_EXIST).asBoolean()
282+
.to(builder::createDatabaseIfNotExist);
273283
mapper.optional(PASSWORD_PUBLISHER).as(Publisher.class)
274-
.to(builder::passwordPublisher);
284+
.to(builder::passwordPublisher);
275285

276286
return builder.build();
277287
}

src/test/java/io/asyncer/r2dbc/mysql/MySqlConnectionConfigurationTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ private static MySqlConnectionConfiguration filledUp() {
230230
.port(3306)
231231
.password("database-password-in-here")
232232
.database("r2dbc")
233+
.createDatabaseIfNotExist(true)
233234
.tcpKeepAlive(true)
234235
.tcpNoDelay(true)
235236
.connectTimeout(Duration.ofSeconds(3))

src/test/java/io/asyncer/r2dbc/mysql/MySqlConnectionFactoryProviderTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ void validProgrammaticUnixSocket() {
277277
.option(SSL, true)
278278
.option(Option.valueOf(CONNECT_TIMEOUT.name()), Duration.ofSeconds(3).toString())
279279
.option(DATABASE, "r2dbc")
280+
.option(Option.valueOf("createDatabaseIfNotExist"), true)
280281
.option(Option.valueOf("serverZoneId"), "Asia/Tokyo")
281282
.option(Option.valueOf("useServerPrepareStatement"), AllTruePredicate.class.getName())
282283
.option(Option.valueOf("zeroDate"), "use_round")
@@ -299,6 +300,7 @@ void validProgrammaticUnixSocket() {
299300
assertThat(configuration.getPassword()).isEqualTo("123456");
300301
assertThat(configuration.getConnectTimeout()).isEqualTo(Duration.ofSeconds(3));
301302
assertThat(configuration.getDatabase()).isEqualTo("r2dbc");
303+
assertThat(configuration.isCreateDatabaseIfNotExist()).isTrue();
302304
assertThat(configuration.getZeroDateOption()).isEqualTo(ZeroDateOption.USE_ROUND);
303305
assertThat(configuration.isTcpKeepAlive()).isTrue();
304306
assertThat(configuration.isTcpNoDelay()).isTrue();

0 commit comments

Comments
 (0)