Skip to content

Commit 50e3dad

Browse files
committed
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 <[email protected]>
1 parent a3611bc commit 50e3dad

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

src/main/java/io/r2dbc/postgresql/codec/EnumCodec.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import io.r2dbc.postgresql.client.Parameter;
2222
import io.r2dbc.postgresql.extension.CodecRegistrar;
2323
import io.r2dbc.postgresql.message.Format;
24-
import io.r2dbc.postgresql.type.PostgresqlObjectId;
2524
import io.r2dbc.postgresql.util.Assert;
2625
import io.r2dbc.postgresql.util.ByteBufUtils;
2726
import reactor.core.publisher.Mono;
@@ -30,7 +29,6 @@
3029
import reactor.util.annotation.Nullable;
3130

3231
import java.util.ArrayList;
33-
import java.util.Collections;
3432
import java.util.LinkedHashMap;
3533
import java.util.List;
3634
import java.util.Map;
@@ -168,6 +166,10 @@ public CodecRegistrar build() {
168166

169167
Map<String, Class<? extends Enum<?>>> mapping = new LinkedHashMap<>(this.mapping);
170168

169+
if (mapping.isEmpty()) {
170+
return (connection, allocator, registry) -> Mono.empty();
171+
}
172+
171173
return (connection, allocator, registry) -> {
172174

173175
List<String> missing = new ArrayList<>(mapping.keySet());

src/main/java/io/r2dbc/postgresql/codec/PostgresTypes.java

+7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import java.util.Objects;
2626
import java.util.StringJoiner;
27+
import java.util.concurrent.atomic.AtomicBoolean;
2728
import java.util.regex.Pattern;
2829

2930
/**
@@ -82,16 +83,22 @@ public Mono<PostgresType> lookupType(String typeName) {
8283
public Flux<PostgresType> lookupTypes(Iterable<String> typeNames) {
8384

8485
StringJoiner joiner = new StringJoiner(",", "(", ")");
86+
AtomicBoolean hasType = new AtomicBoolean();
8587

8688
typeNames.forEach(typeName -> {
8789

8890
if (!TYPENAME.matcher(Assert.requireNonNull(typeName, "typeName must not be null")).matches()) {
8991
throw new IllegalArgumentException(String.format("Invalid typename %s", typeName));
9092
}
9193

94+
hasType.set(true);
9295
joiner.add("'" + typeName + "'");
9396
});
9497

98+
if (!hasType.get()) {
99+
return Flux.empty();
100+
}
101+
95102
return this.connection.createStatement(String.format(SELECT_PG_TYPE, "IN", joiner, "")).execute()
96103
.flatMap(it -> it.map((row, rowMetadata) -> {
97104

src/test/java/io/r2dbc/postgresql/codec/EnumCodecIntegrationTests.java

+18
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,24 @@ protected void customize(PostgresqlConnectionConfiguration.Builder builder) {
5252
builder.codecRegistrar(EnumCodec.builder().withEnum("my_enum_with_codec", MyEnum.class).build());
5353
}
5454

55+
@Test
56+
void shouldNotRegisterIfEmpty() {
57+
58+
PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration.builder()
59+
.database(SERVER.getDatabase())
60+
.host(SERVER.getHost())
61+
.port(SERVER.getPort())
62+
.password(SERVER.getPassword())
63+
.username(SERVER.getUsername())
64+
.codecRegistrar(EnumCodec.builder().build())
65+
.build();
66+
67+
PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(configuration);
68+
connectionFactory.create().flatMap(PostgresqlConnection::close).as(StepVerifier::create).verifyComplete();
69+
70+
// we cannot really assert logs so that's up to you.
71+
}
72+
5573
@Test
5674
void shouldReportUnresolvableTypes() {
5775

0 commit comments

Comments
 (0)