Skip to content

Commit 77ea5be

Browse files
committed
fix(mysql): normalize legacy MariaDB URLs
1 parent e83bbd0 commit 77ea5be

3 files changed

Lines changed: 42 additions & 7 deletions

File tree

app/server/appsmith-plugins/mysqlPlugin/pom.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,6 @@
8787
<dependency>
8888
<groupId>io.r2dbc</groupId>
8989
<artifactId>r2dbc-pool</artifactId>
90-
<!--
91-
Please be careful when upgrading package version from 0.8.x to 0.9.x or higher since 0.9.x version
92-
seems incompatible with r2dbc-mysql version 0.8.2.RELEASE because 0.9.x version contains a higher
93-
version of one of the dependent packages (not able to remember the name of the package at the moment)
94-
-->
9590
<version>0.8.8.RELEASE</version>
9691
<exclusions>
9792
<exclusion>

app/server/appsmith-plugins/mysqlPlugin/src/main/java/com/external/utils/MySqlDatasourceUtils.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public class MySqlDatasourceUtils {
4040

4141
public static int MAX_CONNECTION_POOL_SIZE = 20;
4242

43+
private static final String MARIADB_URL_PREFIX = "r2dbc:mariadb://";
44+
private static final String LEGACY_MARIADB_POOL_URL_PREFIX = "r2dbc:pool:mariadb://";
45+
4346
/**
4447
* 1 sec is the recommended value as shown in the example here:
4548
* https://mariadb.com/docs/xpand/connect/programming-languages/java-r2dbc/native/connection-pools/
@@ -77,7 +80,7 @@ public static ConnectionFactoryOptions.Builder getBuilder(
7780
if (isEmpty(datasourceConfiguration.getEndpoints())) {
7881
urlBuilder.append(datasourceConfiguration.getUrl());
7982
} else {
80-
urlBuilder.append("r2dbc:mariadb://");
83+
urlBuilder.append(MARIADB_URL_PREFIX);
8184
final List<String> hosts = new ArrayList<>();
8285

8386
if (!isSSHEnabled(datasourceConfiguration, CONNECTION_METHOD_INDEX)) {
@@ -111,7 +114,12 @@ public static ConnectionFactoryOptions.Builder getBuilder(
111114
}
112115
}
113116

114-
ConnectionFactoryOptions baseOptions = ConnectionFactoryOptions.parse(urlBuilder.toString());
117+
String connectionUrl = urlBuilder.toString();
118+
if (connectionUrl.startsWith(LEGACY_MARIADB_POOL_URL_PREFIX)) {
119+
connectionUrl = MARIADB_URL_PREFIX + connectionUrl.substring(LEGACY_MARIADB_POOL_URL_PREFIX.length());
120+
}
121+
122+
ConnectionFactoryOptions baseOptions = ConnectionFactoryOptions.parse(connectionUrl);
115123
ConnectionFactoryOptions.Builder ob = ConnectionFactoryOptions.builder()
116124
.from(baseOptions)
117125
.option(ConnectionFactoryOptions.USER, authentication.getUsername())

app/server/appsmith-plugins/mysqlPlugin/src/test/java/com/external/plugins/MySQLDatasourceValidationTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.r2dbc.spi.ConnectionFactoryOptions;
1616
import org.junit.jupiter.api.Test;
1717
import org.mariadb.r2dbc.MariadbConnectionConfiguration;
18+
import org.mariadb.r2dbc.util.HostAddress;
1819
import reactor.core.publisher.Mono;
1920
import reactor.test.StepVerifier;
2021

@@ -208,6 +209,37 @@ public void testStandardConnectionOptionsAreCompatibleWithMariaDbDriver() {
208209
() -> MariadbConnectionConfiguration.fromOptions(options).build());
209210
}
210211

212+
@Test
213+
public void testStoredPoolUrlIsCompatibleWithMariaDbDriver() {
214+
DatasourceConfiguration dsConfig = getDatasourceConfigurationWithStandardConnectionMethod();
215+
dsConfig.setEndpoints(List.of());
216+
dsConfig.setUrl("r2dbc:pool:mariadb://mysqlHost:3306/dbname");
217+
ConnectionFactoryOptions options =
218+
MySqlDatasourceUtils.getBuilder(dsConfig, null).build();
219+
220+
MariadbConnectionConfiguration configuration = assertDoesNotThrow(
221+
() -> MariadbConnectionConfiguration.fromOptions(options).build());
222+
assertEquals("mariadb", options.getValue(DRIVER));
223+
assertNull(options.getValue(PROTOCOL));
224+
assertEquals(List.of(new HostAddress("mysqlHost", 3306)), configuration.getHostAddresses());
225+
}
226+
227+
@Test
228+
public void testMultipleEndpointsAreCompatibleWithMariaDbDriver() {
229+
DatasourceConfiguration dsConfig = getDatasourceConfigurationWithStandardConnectionMethod();
230+
dsConfig.setEndpoints(List.of(new Endpoint("primaryHost", 3306L), new Endpoint("replicaHost", 3307L)));
231+
ConnectionFactoryOptions options =
232+
MySqlDatasourceUtils.getBuilder(dsConfig, null).build();
233+
234+
MariadbConnectionConfiguration configuration = assertDoesNotThrow(
235+
() -> MariadbConnectionConfiguration.fromOptions(options).build());
236+
assertEquals("mariadb", options.getValue(DRIVER));
237+
assertNull(options.getValue(PROTOCOL));
238+
assertEquals(
239+
List.of(new HostAddress("primaryHost", 3306), new HostAddress("replicaHost", 3307)),
240+
configuration.getHostAddresses());
241+
}
242+
211243
@Test
212244
public void testSslToggleMissingError() {
213245
DatasourceConfiguration datasourceConfiguration = getDatasourceConfigurationWithStandardConnectionMethod();

0 commit comments

Comments
 (0)