Skip to content

Commit 642ff3b

Browse files
Kirill Marchukmp911de
authored andcommitted
added workaround for cases when "options" have been provided via URL (and are represented by a String, not a Map)
added unit-tests and type checking (instead of catching ClassCastException) [#273]
1 parent a836d2e commit 642ff3b

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import io.r2dbc.spi.Option;
2525

2626
import javax.net.ssl.HostnameVerifier;
27+
import java.util.HashMap;
28+
import java.util.Locale;
2729
import java.util.Map;
2830
import java.util.function.Function;
2931

@@ -186,7 +188,13 @@ private static PostgresqlConnectionConfiguration createConfiguration(ConnectionF
186188
builder.forceBinary(convertToBoolean(forceBinary));
187189
}
188190

189-
Map<String, String> options = connectionFactoryOptions.getValue(OPTIONS);
191+
Option<Object> optionsAsObject = Option.valueOf("options");
192+
Object optionsObject = connectionFactoryOptions.getValue(optionsAsObject);
193+
194+
Map<String, String> options = optionsObject instanceof String
195+
? mapOptionsFromUrlString((String) optionsObject)
196+
: connectionFactoryOptions.getValue(OPTIONS);
197+
190198
if (options != null) {
191199
builder.options(options);
192200
}
@@ -272,4 +280,16 @@ private static boolean convertToBoolean(Object value) {
272280
private static int convertToInt(Object value) {
273281
return value instanceof Integer ? (int) value : Integer.parseInt(value.toString());
274282
}
283+
284+
private static Map<String, String> mapOptionsFromUrlString(String optionsString) {
285+
Map<String, String> result = new HashMap<>();
286+
for (String pair : optionsString.split(";")) {
287+
String[] nameValue = pair.split("=");
288+
if (nameValue.length != 2) {
289+
throw new IllegalArgumentException(String.format("One of the options, provided via URL is not a valid name=value pair: %s", pair));
290+
}
291+
result.put(nameValue[0], nameValue[1]);
292+
}
293+
return result;
294+
}
275295
}

src/test/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProviderTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.r2dbc.spi.Option;
2323
import org.junit.jupiter.api.Test;
2424

25+
import java.util.Collections;
2526
import java.util.HashMap;
2627
import java.util.Map;
2728

@@ -276,4 +277,38 @@ void shouldConnectUsingUnixDomainSocket() {
276277
assertThat(factory.getConfiguration().getRequiredSocket()).isEqualTo("/tmp/.s.PGSQL.5432");
277278
}
278279

280+
@Test
281+
void shouldParseOptionsProvidedAsString() {
282+
final Option<String> options = Option.valueOf("options");
283+
PostgresqlConnectionFactory factory = this.provider.create(builder()
284+
.option(DRIVER, POSTGRESQL_DRIVER)
285+
.option(HOST, "test-host")
286+
.option(PASSWORD, "test-password")
287+
.option(USER, "test-user")
288+
.option(options, "search_path=public,private;default_tablespace=unknown")
289+
.build());
290+
291+
assertThat(factory.getConfiguration().getOptions().get("search_path")).isEqualTo("public,private");
292+
assertThat(factory.getConfiguration().getOptions().get("default_tablespace")).isEqualTo("unknown");
293+
}
294+
295+
@Test
296+
void shouldParseOptionsProvidedAsMap() {
297+
final Option<Map<String, String>> options = Option.valueOf("options");
298+
299+
Map<String, String> optionsMap = new HashMap<>();
300+
optionsMap.put("search_path", "public,private");
301+
optionsMap.put("default_tablespace", "unknown");
302+
303+
PostgresqlConnectionFactory factory = this.provider.create(builder()
304+
.option(DRIVER, POSTGRESQL_DRIVER)
305+
.option(HOST, "test-host")
306+
.option(PASSWORD, "test-password")
307+
.option(USER, "test-user")
308+
.option(options, optionsMap)
309+
.build());
310+
311+
assertThat(factory.getConfiguration().getOptions().get("search_path")).isEqualTo("public,private");
312+
assertThat(factory.getConfiguration().getOptions().get("default_tablespace")).isEqualTo("unknown");
313+
}
279314
}

0 commit comments

Comments
 (0)