Skip to content

Commit

Permalink
Add option to enable createDatabaseIfNotExist
Browse files Browse the repository at this point in the history
  • Loading branch information
mirromutth committed Dec 13, 2023
1 parent 82a2a8a commit 46e9e69
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ public final class MySqlConnectionConfiguration {

private final String database;

private final boolean createDatabaseIfNotExist;

@Nullable
private final Predicate<String> preferPrepareStatement;

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

private MySqlConnectionConfiguration(boolean isHost, String domain, int port, MySqlSslConfiguration ssl,
private MySqlConnectionConfiguration(
boolean isHost, String domain, int port, MySqlSslConfiguration ssl,
boolean tcpKeepAlive, boolean tcpNoDelay, @Nullable Duration connectTimeout,
@Nullable Duration socketTimeout, ZeroDateOption zeroDateOption, @Nullable ZoneId serverZoneId,
String user, @Nullable CharSequence password, @Nullable String database,
@Nullable Predicate<String> preferPrepareStatement, int queryCacheSize, int prepareCacheSize,
Extensions extensions, @Nullable Publisher<String> passwordPublisher) {
boolean createDatabaseIfNotExist, @Nullable Predicate<String> preferPrepareStatement,
int queryCacheSize, int prepareCacheSize, Extensions extensions,
@Nullable Publisher<String> passwordPublisher
) {
this.isHost = isHost;
this.domain = domain;
this.port = port;
Expand All @@ -115,6 +120,7 @@ private MySqlConnectionConfiguration(boolean isHost, String domain, int port, My
this.user = requireNonNull(user, "user must not be null");
this.password = password;
this.database = database == null || database.isEmpty() ? "" : database;
this.createDatabaseIfNotExist = createDatabaseIfNotExist;
this.preferPrepareStatement = preferPrepareStatement;
this.queryCacheSize = queryCacheSize;
this.prepareCacheSize = prepareCacheSize;
Expand Down Expand Up @@ -192,6 +198,10 @@ String getDatabase() {
return database;
}

boolean isCreateDatabaseIfNotExist() {
return createDatabaseIfNotExist;
}

@Nullable
Predicate<String> getPreferPrepareStatement() {
return preferPrepareStatement;
Expand Down Expand Up @@ -236,6 +246,7 @@ public boolean equals(Object o) {
user.equals(that.user) &&
Objects.equals(password, that.password) &&
database.equals(that.database) &&
createDatabaseIfNotExist == that.createDatabaseIfNotExist &&
Objects.equals(preferPrepareStatement, that.preferPrepareStatement) &&
queryCacheSize == that.queryCacheSize &&
prepareCacheSize == that.prepareCacheSize &&
Expand All @@ -245,29 +256,31 @@ public boolean equals(Object o) {

@Override
public int hashCode() {
return Objects.hash(isHost, domain, port, ssl, tcpKeepAlive, tcpNoDelay,
connectTimeout, socketTimeout, serverZoneId, zeroDateOption, user, password, database,
preferPrepareStatement, queryCacheSize, prepareCacheSize, extensions, passwordPublisher);
return Objects.hash(isHost, domain, port, ssl, tcpKeepAlive, tcpNoDelay, connectTimeout,
socketTimeout, serverZoneId, zeroDateOption, user, password, database, createDatabaseIfNotExist,
preferPrepareStatement, queryCacheSize, prepareCacheSize, extensions, passwordPublisher);
}

@Override
public String toString() {
if (isHost) {
return "MySqlConnectionConfiguration{, host='" + domain + "', port=" + port + ", ssl=" + ssl +
", tcpNoDelay=" + tcpNoDelay + ", tcpKeepAlive=" + tcpKeepAlive + ", connectTimeout=" +
connectTimeout + ", socketTimeout=" + socketTimeout + ", serverZoneId=" + serverZoneId +
", zeroDateOption=" + zeroDateOption + ", user='" + user + '\'' + ", password=" + password +
", database='" + database + "', preferPrepareStatement=" + preferPrepareStatement +
", queryCacheSize=" + queryCacheSize + ", prepareCacheSize=" + prepareCacheSize +
", extensions=" + extensions + ", passwordPublisher=" + passwordPublisher + '}';
", tcpNoDelay=" + tcpNoDelay + ", tcpKeepAlive=" + tcpKeepAlive + ", connectTimeout=" +
connectTimeout + ", socketTimeout=" + socketTimeout + ", serverZoneId=" + serverZoneId +
", zeroDateOption=" + zeroDateOption + ", user='" + user + '\'' + ", password=" + password +
", database='" + database + ", createDatabaseIfNotExist=" + createDatabaseIfNotExist +
"', preferPrepareStatement=" + preferPrepareStatement + ", queryCacheSize=" + queryCacheSize +
", prepareCacheSize=" + prepareCacheSize + ", extensions=" + extensions +
", passwordPublisher=" + passwordPublisher + '}';
}

return "MySqlConnectionConfiguration{, unixSocket='" + domain + "', connectTimeout=" +
connectTimeout + ", socketTimeout=" + socketTimeout + ", serverZoneId=" + serverZoneId +
", zeroDateOption=" + zeroDateOption + ", user='" + user + "', password=" + password +
", database='" + database + "', preferPrepareStatement=" + preferPrepareStatement +
", queryCacheSize=" + queryCacheSize + ", prepareCacheSize=" + prepareCacheSize +
", extensions=" + extensions + ", passwordPublisher=" + passwordPublisher + '}';
connectTimeout + ", socketTimeout=" + socketTimeout + ", serverZoneId=" + serverZoneId +
", zeroDateOption=" + zeroDateOption + ", user='" + user + "', password=" + password +
", database='" + database + ", createDatabaseIfNotExist=" + createDatabaseIfNotExist +
"', preferPrepareStatement=" + preferPrepareStatement + ", queryCacheSize=" + queryCacheSize +
", prepareCacheSize=" + prepareCacheSize + ", extensions=" + extensions +
", passwordPublisher=" + passwordPublisher + '}';
}

/**
Expand All @@ -278,6 +291,8 @@ public static final class Builder {
@Nullable
private String database;

private boolean createDatabaseIfNotExist;

private boolean isHost = true;

private String domain;
Expand Down Expand Up @@ -364,7 +379,7 @@ public MySqlConnectionConfiguration build() {
sslCa, sslKey, sslKeyPassword, sslCert, sslContextBuilderCustomizer);
return new MySqlConnectionConfiguration(isHost, domain, port, ssl, tcpKeepAlive, tcpNoDelay,
connectTimeout, socketTimeout, zeroDateOption, serverZoneId, user, password, database,
preferPrepareStatement, queryCacheSize, prepareCacheSize,
createDatabaseIfNotExist, preferPrepareStatement, queryCacheSize, prepareCacheSize,
Extensions.from(extensions, autodetectExtensions), passwordPublisher);
}

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

/**
* Configure to create the database given in the configuration if it does not yet exist. Default to
* {@code false}.
*
* @param enabled to discover and register extensions.
* @return this {@link Builder}.
* @since 1.0.6
*/
public Builder createDatabaseIfNotExist(boolean enabled) {
this.createDatabaseIfNotExist = enabled;
return this;
}

/**
* Configure the Unix Domain Socket to connect to.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,14 @@ public final class MySqlConnectionFactoryProvider implements ConnectionFactoryPr
*/
public static final Option<Boolean> TCP_NO_DELAY = Option.valueOf("tcpNoDelay");

/**
* Enable/Disable database creation if not exist.
*
* @since 1.0.6
*/
public static final Option<Boolean> CREATE_DATABASE_IF_NOT_EXIST =
Option.valueOf("createDatabaseIfNotExist");

/**
* Enable server preparing for parametrized statements and prefer server preparing simple statements.
* <p>
Expand Down Expand Up @@ -270,8 +278,10 @@ static MySqlConnectionConfiguration setup(ConnectionFactoryOptions options) {
.to(builder::socketTimeout);
mapper.optional(DATABASE).asString()
.to(builder::database);
mapper.optional(CREATE_DATABASE_IF_NOT_EXIST).asBoolean()
.to(builder::createDatabaseIfNotExist);
mapper.optional(PASSWORD_PUBLISHER).as(Publisher.class)
.to(builder::passwordPublisher);
.to(builder::passwordPublisher);

return builder.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ private static MySqlConnectionConfiguration filledUp() {
.port(3306)
.password("database-password-in-here")
.database("r2dbc")
.createDatabaseIfNotExist(true)
.tcpKeepAlive(true)
.tcpNoDelay(true)
.connectTimeout(Duration.ofSeconds(3))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@ void validProgrammaticUnixSocket() {
.option(SSL, true)
.option(Option.valueOf(CONNECT_TIMEOUT.name()), Duration.ofSeconds(3).toString())
.option(DATABASE, "r2dbc")
.option(Option.valueOf("createDatabaseIfNotExist"), true)
.option(Option.valueOf("serverZoneId"), "Asia/Tokyo")
.option(Option.valueOf("useServerPrepareStatement"), AllTruePredicate.class.getName())
.option(Option.valueOf("zeroDate"), "use_round")
Expand All @@ -299,6 +300,7 @@ void validProgrammaticUnixSocket() {
assertThat(configuration.getPassword()).isEqualTo("123456");
assertThat(configuration.getConnectTimeout()).isEqualTo(Duration.ofSeconds(3));
assertThat(configuration.getDatabase()).isEqualTo("r2dbc");
assertThat(configuration.isCreateDatabaseIfNotExist()).isTrue();
assertThat(configuration.getZeroDateOption()).isEqualTo(ZeroDateOption.USE_ROUND);
assertThat(configuration.isTcpKeepAlive()).isTrue();
assertThat(configuration.isTcpNoDelay()).isTrue();
Expand Down

0 comments on commit 46e9e69

Please sign in to comment.