From 3672c300875e1d49baf0858d6d3456bf1b051685 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 24 May 2022 13:33:25 +0200 Subject: [PATCH] Skip EnumCodec registration if the builder has no mappings. Also, improve PostgresTypes safety if the collection of type names is empty. [resolves #515] Signed-off-by: Mark Paluch --- .../io/r2dbc/postgresql/codec/EnumCodec.java | 4 ++++ .../r2dbc/postgresql/codec/PostgresTypes.java | 7 +++++++ .../codec/EnumCodecIntegrationTests.java | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/main/java/io/r2dbc/postgresql/codec/EnumCodec.java b/src/main/java/io/r2dbc/postgresql/codec/EnumCodec.java index d221bdfb..f736969f 100644 --- a/src/main/java/io/r2dbc/postgresql/codec/EnumCodec.java +++ b/src/main/java/io/r2dbc/postgresql/codec/EnumCodec.java @@ -212,6 +212,10 @@ public CodecRegistrar build() { Map>> mapping = new LinkedHashMap<>(this.mapping); + if (mapping.isEmpty()) { + return (connection, allocator, registry) -> Mono.empty(); + } + return (connection, allocator, registry) -> { List missing = new ArrayList<>(mapping.keySet()); diff --git a/src/main/java/io/r2dbc/postgresql/codec/PostgresTypes.java b/src/main/java/io/r2dbc/postgresql/codec/PostgresTypes.java index cb1d7b7d..1ce5747e 100644 --- a/src/main/java/io/r2dbc/postgresql/codec/PostgresTypes.java +++ b/src/main/java/io/r2dbc/postgresql/codec/PostgresTypes.java @@ -25,6 +25,7 @@ import java.util.Objects; import java.util.StringJoiner; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; /** @@ -85,6 +86,7 @@ public Mono lookupType(String typeName) { public Flux lookupTypes(Iterable typeNames) { StringJoiner joiner = new StringJoiner(",", "(", ")"); + AtomicBoolean hasType = new AtomicBoolean(); typeNames.forEach(typeName -> { @@ -92,9 +94,14 @@ public Flux lookupTypes(Iterable typeNames) { throw new IllegalArgumentException(String.format("Invalid typename %s", typeName)); } + hasType.set(true); joiner.add("'" + typeName + "'"); }); + if (!hasType.get()) { + return Flux.empty(); + } + return this.connection.createStatement(String.format(SELECT_PG_TYPE, "IN", joiner, "")).execute() .flatMap(it -> it.map((row, rowMetadata) -> { diff --git a/src/test/java/io/r2dbc/postgresql/codec/EnumCodecIntegrationTests.java b/src/test/java/io/r2dbc/postgresql/codec/EnumCodecIntegrationTests.java index a39e9757..64c5ba4a 100644 --- a/src/test/java/io/r2dbc/postgresql/codec/EnumCodecIntegrationTests.java +++ b/src/test/java/io/r2dbc/postgresql/codec/EnumCodecIntegrationTests.java @@ -54,6 +54,24 @@ protected void customize(PostgresqlConnectionConfiguration.Builder builder) { builder.codecRegistrar(EnumCodec.builder().withEnum("my_enum_with_codec", MyEnum.class).build()); } + @Test + void shouldNotRegisterIfEmpty() { + + PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration.builder() + .database(SERVER.getDatabase()) + .host(SERVER.getHost()) + .port(SERVER.getPort()) + .password(SERVER.getPassword()) + .username(SERVER.getUsername()) + .codecRegistrar(EnumCodec.builder().build()) + .build(); + + PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(configuration); + connectionFactory.create().flatMap(PostgresqlConnection::close).as(StepVerifier::create).verifyComplete(); + + // we cannot really assert logs so that's up to you. + } + @Test void shouldReportUnresolvableTypes() {