From a6e99c142f68852e1730e13baabd7f8a322901a0 Mon Sep 17 00:00:00 2001 From: oshai Date: Mon, 4 Sep 2023 02:28:12 +0300 Subject: [PATCH] r2dbc: parse duration when string option Fix issue #412 --- .../main/java/MysqlConnectionFactoryProvider.kt | 16 ++++++++++++++-- .../mysql/MysqlConnectionFactoryProviderTest.kt | 12 ++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/r2dbc-mysql/src/main/java/MysqlConnectionFactoryProvider.kt b/r2dbc-mysql/src/main/java/MysqlConnectionFactoryProvider.kt index 38ea337c..67f3a07f 100644 --- a/r2dbc-mysql/src/main/java/MysqlConnectionFactoryProvider.kt +++ b/r2dbc-mysql/src/main/java/MysqlConnectionFactoryProvider.kt @@ -77,8 +77,8 @@ class MysqlConnectionFactoryProvider : ConnectionFactoryProvider { password = connectionFactoryOptions.getValue(PASSWORD)?.toString(), database = connectionFactoryOptions.getValue(DATABASE) as String?, applicationName = connectionFactoryOptions.getValue(APPLICATION_NAME) as String?, - connectionTimeout = (connectionFactoryOptions.getValue(CONNECT_TIMEOUT) as Duration?)?.toMillis()?.toInt() ?: 5000, - queryTimeout = connectionFactoryOptions.getValue(STATEMENT_TIMEOUT) as Duration?, + connectionTimeout = connectionFactoryOptions.getValue(CONNECT_TIMEOUT)?.parseDuration()?.toMillis()?.toInt() ?: 5000, + queryTimeout = connectionFactoryOptions.getValue(STATEMENT_TIMEOUT)?.parseDuration(), ssl = MysqlSSLConfigurationFactory.create(connectionFactoryOptions), rsaPublicKey = (connectionFactoryOptions.getValue(SERVER_RSA_PUBLIC_KEY_FILE) as String?)?.let { Paths.get(it) } ) @@ -97,3 +97,15 @@ class MysqlConnectionFactoryProvider : ConnectionFactoryProvider { override fun getDriver(): String = MYSQL_DRIVER } + +private fun Any.parseDuration(): Duration { + return when (this) { + is Duration -> { + this + } + is String -> { + Duration.parse(this) + } + else -> throw Exception("cant parse $this to Duration") + } +} diff --git a/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/MysqlConnectionFactoryProviderTest.kt b/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/MysqlConnectionFactoryProviderTest.kt index 24edfcf5..63753f6a 100644 --- a/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/MysqlConnectionFactoryProviderTest.kt +++ b/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/MysqlConnectionFactoryProviderTest.kt @@ -4,6 +4,7 @@ import com.github.jasync.sql.db.SSLConfiguration import io.r2dbc.spi.ConnectionFactoryOptions import org.junit.Assert.assertEquals import org.junit.Test +import java.time.Duration class MysqlConnectionFactoryProviderTest { @@ -63,4 +64,15 @@ class MysqlConnectionFactoryProviderTest { // then assertEquals("rsa.pem", result.mySQLConnectionFactory.configuration.rsaPublicKey.toString()) } + + @Test + fun shouldUseTimeoutAsString() { + val options = ConnectionFactoryOptions.parse("r2dbc:mysql://user@host/db?connectTimeout=PT3S") + + // when + val result = provider.create(options) + + // then + assertEquals(Duration.parse("PT3S").toMillis().toInt(), result.mySQLConnectionFactory.configuration.connectionTimeout) + } }