diff --git a/README.md b/README.md index e287fdc..8bee6c1 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,7 @@ Basic example: | **`loopResources`** | permits to share netty EventLoopGroup among multiple async libraries/framework | *LoopResources* | | | **`sslContextBuilderCustomizer`** | Permits to customized SSL context builder. | *UnaryOperator* | | | **`sslTunnelDisableHostVerification`** | Disable hostname verification during SSLHandshake when SslMode.TUNNEL is set | *boolean* | | +| **`timezone`** | permits to force session timezone in case of client having a different timezone compare to server. The option `timezone` can have 3 types of value: * 'disabled' (default) : connector doesn't change time_zone. * 'auto': client will use client default timezone. * '': connector will set connection variable to value. Since 1.2.0 | String | 'disabled' | | **`permitRedirect`** | Permit server redirection | *boolean* | true | | **`skipPostCommands`** | Permit to indicate that commands after connections must be skipped. This permit to avoid unnecessary command on connection creation, and when using RDV proxy not to have session pinning. Use with care, because connector expects server to have : 1.connection exchanges to be UT8(mb3/mb4). 2.autocommit set to true. 3.transaction isolation defaulting to REPEATABLE-READ | *boolean* | 'false' | diff --git a/src/main/java/org/mariadb/r2dbc/MariadbCommonStatement.java b/src/main/java/org/mariadb/r2dbc/MariadbCommonStatement.java index 731eee0..1721d16 100644 --- a/src/main/java/org/mariadb/r2dbc/MariadbCommonStatement.java +++ b/src/main/java/org/mariadb/r2dbc/MariadbCommonStatement.java @@ -155,7 +155,6 @@ public Flux toResult( generatedColumns, client.getVersion().supportReturning(), configuration)) - .flatMap(m -> client.redirect().then(Mono.just(m))) .cast(org.mariadb.r2dbc.api.MariadbResult.class); } diff --git a/src/main/java/org/mariadb/r2dbc/MariadbConnectionConfiguration.java b/src/main/java/org/mariadb/r2dbc/MariadbConnectionConfiguration.java index 6ee60c5..5de8d11 100644 --- a/src/main/java/org/mariadb/r2dbc/MariadbConnectionConfiguration.java +++ b/src/main/java/org/mariadb/r2dbc/MariadbConnectionConfiguration.java @@ -44,7 +44,6 @@ public final class MariadbConnectionConfiguration { private final SslConfig sslConfig; private final boolean useServerPrepStmts; private final Boolean autocommit; - private final boolean permitRedirect; private final String[] restrictedAuth; private final LoopResources loopResources; private final UnaryOperator sslContextBuilderCustomizer; @@ -74,7 +73,6 @@ private MariadbConnectionConfiguration( SslMode sslMode, boolean useServerPrepStmts, Boolean autocommit, - boolean permitRedirect, boolean skipPostCommands, @Nullable Integer prepareCacheSize, @Nullable CharSequence[] pamOtherPwd, @@ -118,7 +116,6 @@ private MariadbConnectionConfiguration( this.prepareCacheSize = (prepareCacheSize == null) ? 250 : prepareCacheSize; this.pamOtherPwd = pamOtherPwd; this.autocommit = (autocommit != null) ? autocommit : Boolean.TRUE; - this.permitRedirect = permitRedirect; this.skipPostCommands = skipPostCommands; this.loopResources = loopResources != null ? loopResources : TcpResources.get(); this.useServerPrepStmts = !this.allowMultiQueries && useServerPrepStmts; @@ -145,7 +142,6 @@ private MariadbConnectionConfiguration( SslConfig sslConfig, boolean useServerPrepStmts, Boolean autocommit, - boolean permitRedirect, boolean skipPostCommands, String[] restrictedAuth, LoopResources loopResources, @@ -169,44 +165,12 @@ private MariadbConnectionConfiguration( this.sslConfig = sslConfig; this.useServerPrepStmts = useServerPrepStmts; this.autocommit = (autocommit != null) ? autocommit : Boolean.TRUE; - this.permitRedirect = permitRedirect; this.skipPostCommands = skipPostCommands; this.restrictedAuth = restrictedAuth; this.loopResources = loopResources; this.sslContextBuilderCustomizer = sslContextBuilderCustomizer; } - public MariadbConnectionConfiguration redirectConf( - HostAddress hostAddress, String user, CharSequence password) { - // same connection, but with hostAddress, user and password changed - // + redirection disabled to avoid redirection loop - return new MariadbConnectionConfiguration( - this.database, - Collections.singletonList(hostAddress), - this.haMode, - this.connectTimeout, - this.tcpKeepAlive, - this.tcpAbortiveClose, - this.transactionReplay, - password, - this.pamOtherPwd, - hostAddress.getPort(), - this.prepareCacheSize, - this.socket, - user, - this.allowMultiQueries, - this.connectionAttributes, - this.sessionVariables, - this.sslConfig, - this.useServerPrepStmts, - this.autocommit, - this.skipPostCommands, - false, - this.restrictedAuth, - this.loopResources, - this.sslContextBuilderCustomizer); - } - static boolean boolValue(Object value) { if (value instanceof Boolean) { return (Boolean) value; @@ -306,11 +270,6 @@ public static Builder fromOptions(ConnectionFactoryOptions connectionFactoryOpti } } - if (connectionFactoryOptions.hasOption(MariadbConnectionFactoryProvider.PERMIT_REDIRECT)) { - builder.permitRedirect( - boolValue( - connectionFactoryOptions.getValue(MariadbConnectionFactoryProvider.PERMIT_REDIRECT))); - } if (connectionFactoryOptions.hasOption(MariadbConnectionFactoryProvider.SKIP_POST_COMMANDS)) { builder.skipPostCommands( boolValue( @@ -500,10 +459,6 @@ public Boolean autocommit() { return autocommit; } - public boolean permitRedirect() { - return permitRedirect; - } - public boolean skipPostCommands() { return skipPostCommands; } @@ -712,7 +667,6 @@ public static final class Builder implements Cloneable { private boolean allowMultiQueries = false; private boolean useServerPrepStmts = false; private Boolean autocommit = Boolean.TRUE; - private boolean permitRedirect = true; private boolean skipPostCommands = false; @Nullable private List tlsProtocol; @Nullable private String serverSslCert; @@ -776,7 +730,6 @@ private MariadbConnectionConfiguration build(boolean checkMandatory) { this.sslMode, this.useServerPrepStmts, this.autocommit, - this.permitRedirect, this.skipPostCommands, this.prepareCacheSize, this.pamOtherPwd, @@ -1007,17 +960,6 @@ public Builder autocommit(Boolean autocommit) { return this; } - /** - * Permit to indicate if redirection are allowed. Default value True. - * - * @param permitRedirect use permitRedirect - * @return this {@link Builder} - */ - public Builder permitRedirect(boolean permitRedirect) { - this.permitRedirect = permitRedirect; - return this; - } - /** * Permit to indicate that commands after connections must be skipped. This permit to avoid * unnecessary command on connection creation, and when using RDV proxy not to have session @@ -1171,8 +1113,6 @@ public String toString() { + hiddenPamPwd + ", autoCommit=" + autocommit - + ", permitRedirect=" - + permitRedirect + '}'; } } diff --git a/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryProvider.java b/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryProvider.java index 9b4179c..f6b0d95 100644 --- a/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryProvider.java +++ b/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryProvider.java @@ -25,7 +25,6 @@ public final class MariadbConnectionFactoryProvider implements ConnectionFactory public static final Option USE_SERVER_PREPARE = Option.valueOf("useServerPrepStmts"); public static final Option AUTO_COMMIT = Option.valueOf("autocommit"); - public static final Option PERMIT_REDIRECT = Option.valueOf("permitRedirect"); public static final Option SKIP_POST_COMMANDS = Option.valueOf("skipPostCommands"); public static final Option PREPARE_CACHE_SIZE = Option.valueOf("prepareCacheSize"); public static final Option SSL_MODE = Option.valueOf("sslMode"); diff --git a/src/main/java/org/mariadb/r2dbc/client/Client.java b/src/main/java/org/mariadb/r2dbc/client/Client.java index 4989ae4..a27c351 100644 --- a/src/main/java/org/mariadb/r2dbc/client/Client.java +++ b/src/main/java/org/mariadb/r2dbc/client/Client.java @@ -77,6 +77,4 @@ Mono sendSslRequest( long getThreadId(); HostAddress getHostAddress(); - - Mono redirect(); } diff --git a/src/main/java/org/mariadb/r2dbc/client/FailoverClient.java b/src/main/java/org/mariadb/r2dbc/client/FailoverClient.java index 849418e..42771f8 100644 --- a/src/main/java/org/mariadb/r2dbc/client/FailoverClient.java +++ b/src/main/java/org/mariadb/r2dbc/client/FailoverClient.java @@ -573,9 +573,4 @@ public long getThreadId() { public HostAddress getHostAddress() { return client.get().getHostAddress(); } - - @Override - public Mono redirect() { - return client.get().redirect(); - } } diff --git a/src/main/java/org/mariadb/r2dbc/client/SimpleClient.java b/src/main/java/org/mariadb/r2dbc/client/SimpleClient.java index e07d8e9..456e7af 100644 --- a/src/main/java/org/mariadb/r2dbc/client/SimpleClient.java +++ b/src/main/java/org/mariadb/r2dbc/client/SimpleClient.java @@ -59,10 +59,6 @@ public class SimpleClient implements Client { private static final Logger logger = Loggers.getLogger(SimpleClient.class); - private static final Pattern REDIRECT_URL_FORMAT = - Pattern.compile( - "(mariadb|mysql)://(([^/@:]+)?(:([^/]+))?@)?(([^/:]+)(:([0-9]+))?)(/([^?]+)(/?(.*))?)?$", - Pattern.CASE_INSENSITIVE | Pattern.DOTALL); protected MariadbConnectionConfiguration configuration; protected final ReentrantLock lock; @@ -144,70 +140,6 @@ protected SimpleClient( .subscribe(); } - public Mono redirect() { - if (configuration.permitRedirect() && context.getRedirectValue() != null) { - // redirect only if : - // * when pipelining, having received all waiting responses. - // * not in a transaction - if (this.exchangeQueue.size() <= 1 - && (this.context.getServerStatus() & ServerStatus.IN_TRANSACTION) == 0) { - String redirectValue = context.getRedirectValue(); - context.setRedirect(null); - // redirection required - Matcher matcher = REDIRECT_URL_FORMAT.matcher(redirectValue); - if (!matcher.matches()) { - return Mono.error( - new SQLSyntaxErrorException( - "error parsing redirection string '" - + redirectValue - + "'. format must be" - + " 'mariadb/mysql://[[:]@][:]/[[?=[&=]]]'")); - } - - try { - String host = - matcher.group(7) != null - ? URLDecoder.decode(matcher.group(7), "UTF-8") - : matcher.group(6); - int port = matcher.group(9) != null ? Integer.parseInt(matcher.group(9)) : 3306; - HostAddress hostAddress = new HostAddress(host, port); - - // actually only options accepted are user and password - // there might be additional possible options in the future - String user = (matcher.group(3) != null) ? matcher.group(3) : configuration.getUsername(); - CharSequence password = - (matcher.group(5) != null) ? matcher.group(5) : configuration.getPassword(); - - MariadbConnectionConfiguration redirectConf = - configuration.redirectConf(hostAddress, user, password); - - return SimpleClient.connect( - ConnectionProvider.newConnection(), - InetSocketAddress.createUnresolved(hostAddress.getHost(), hostAddress.getPort()), - hostAddress, - redirectConf, - lock) - .delayUntil(client -> AuthenticationFlow.exchange(client, redirectConf, hostAddress)) - .doOnError(e -> HaMode.failHost(hostAddress)) - .onErrorComplete() - .flatMap(client -> MariadbConnectionFactory.retrieveSingleStoreVersion(redirectConf, client)) - .cast(SimpleClient.class) - .flatMap( - client -> - MariadbConnectionFactory.setSessionVariables(redirectConf, client) - .then(Mono.just(client))) - .flatMap(this::refreshClient) - .then(); - } catch (UnsupportedEncodingException e) { - // "UTF-8" is known, but String decode(String s, Charset charset) requires java 10+ to get - // rid of catching error - return Mono.error(e); - } - } - } - return Mono.empty(); - } - public Mono refreshClient(SimpleClient client) { return quitOrClose() .then( @@ -420,7 +352,6 @@ private Mono executeWhenTransaction(String sql) { return messages .doOnDiscard(ReferenceCounted.class, ReferenceCountUtil::release) .handle(ExceptionFactory.withSql(sql)::handleErrorResponse) - .flatMap(m -> redirect().then(Mono.just(m))) .then(); } return Mono.empty(); @@ -438,7 +369,6 @@ private Mono executeWhenNotInTransaction(String sql) { return messages .doOnDiscard(ReferenceCounted.class, ReferenceCountUtil::release) .handle(ExceptionFactory.withSql(sql)::handleErrorResponse) - .flatMap(m -> redirect().then(Mono.just(m))) .then(); } return Mono.empty(); @@ -481,7 +411,6 @@ public Mono setAutoCommit(boolean autoCommit) { null, true, configuration)) - .flatMap(m -> redirect().then(Mono.just(m))) .cast(org.mariadb.r2dbc.api.MariadbResult.class) .then(); } diff --git a/src/main/java/org/mariadb/r2dbc/client/SimpleContext.java b/src/main/java/org/mariadb/r2dbc/client/SimpleContext.java index ae2ab54..08378fc 100644 --- a/src/main/java/org/mariadb/r2dbc/client/SimpleContext.java +++ b/src/main/java/org/mariadb/r2dbc/client/SimpleContext.java @@ -13,7 +13,6 @@ public class SimpleContext implements Context { private final long clientCapabilities; private final ServerVersion version; private final ByteBufAllocator byteBufAllocator; - private String redirectValue; private short serverStatus; private String database; @@ -34,7 +33,6 @@ public SimpleContext( this.version = new ServerVersion(serverVersion, mariaDBServer); this.database = database; this.byteBufAllocator = byteBufAllocator; - this.redirectValue = null; } public long getThreadId() { @@ -73,15 +71,6 @@ public ByteBufAllocator getByteBufAllocator() { return byteBufAllocator; } - @Override - public void setRedirect(String redirectValue) { - this.redirectValue = redirectValue; - } - - public String getRedirectValue() { - return redirectValue; - } - @Override public String toString() { return "ConnectionContext{" + "threadId=" + threadId + ", version=" + version + '}'; diff --git a/src/main/java/org/mariadb/r2dbc/message/Context.java b/src/main/java/org/mariadb/r2dbc/message/Context.java index 6782b88..f6f7ea5 100644 --- a/src/main/java/org/mariadb/r2dbc/message/Context.java +++ b/src/main/java/org/mariadb/r2dbc/message/Context.java @@ -19,10 +19,6 @@ public interface Context { void setServerStatus(short serverStatus); - void setRedirect(String redirectValue); - - String getRedirectValue(); - String getDatabase(); void setDatabase(String database); diff --git a/src/test/java/org/mariadb/r2dbc/integration/ConfigurationTest.java b/src/test/java/org/mariadb/r2dbc/integration/ConfigurationTest.java index 7fce7e1..c70600b 100644 --- a/src/test/java/org/mariadb/r2dbc/integration/ConfigurationTest.java +++ b/src/test/java/org/mariadb/r2dbc/integration/ConfigurationTest.java @@ -357,7 +357,7 @@ void confStringValue() { + " prepareCacheSize=null, tlsProtocol=null, serverSslCert=null," + " clientSslCert=null, clientSslKey=null, clientSslPassword=null, sslMode=TRUST," + " sslTunnelDisableHostVerification=false, pamOtherPwd=*,*," - + " autoCommit=true, permitRedirect=true}", + + " autoCommit=true}", builder.toString()); builder.tlsProtocol((String) null); Assertions.assertEquals( @@ -370,7 +370,7 @@ void confStringValue() { + " prepareCacheSize=null, tlsProtocol=null, serverSslCert=null," + " clientSslCert=null, clientSslKey=null, clientSslPassword=null, sslMode=TRUST," + " sslTunnelDisableHostVerification=false, pamOtherPwd=*,*," - + " autoCommit=true, permitRedirect=true}", + + " autoCommit=true}", builder.toString()); MariadbConnectionConfiguration conf = builder.build(); Assertions.assertEquals("sslMode=trust", conf.getSslConfig().toString());