Skip to content

Commit b369ae8

Browse files
committed
Use PostgresTypeIdentifier instead of PostgresqlObjectId to accept dynamic types in codecs
[resolves pgjdbc#378]
1 parent a3f28a0 commit b369ae8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+135
-74
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ final EncodedParameter doEncode(Object[] value) {
144144
}
145145

146146
@Override
147-
EncodedParameter doEncode(Object[] value, PostgresqlObjectId dataType) {
147+
EncodedParameter doEncode(Object[] value, PostgresTypeIdentifier dataType) {
148148
Assert.requireNonNull(value, "value must not be null");
149149

150150
return encodeArray(() -> {
@@ -161,7 +161,7 @@ EncodedParameter doEncode(Object[] value, PostgresqlObjectId dataType) {
161161
* @param dataType the Postgres data type
162162
* @return encoded {@link EncodedParameter} item
163163
*/
164-
abstract EncodedParameter encodeArray(Supplier<ByteBuf> encodedSupplier, PostgresqlObjectId dataType);
164+
abstract EncodedParameter encodeArray(Supplier<ByteBuf> encodedSupplier, PostgresTypeIdentifier dataType);
165165

166166
/**
167167
* Encode a single array item using text format.

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

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public final EncodedParameter encode(Object value) {
9494
public EncodedParameter encode(Object value, int dataType) {
9595
Assert.requireNonNull(value, "value must not be null");
9696

97-
return doEncode((T) value, PostgresqlObjectId.valueOf(dataType));
97+
return doEncode((T) value, PostgresqlObjectId.isValid(dataType) ? PostgresqlObjectId.valueOf(dataType) : new SimplePostgresTypeIdentifier(dataType));
9898
}
9999

100100
public EncodedParameter encodeNull(int dataType) {
@@ -116,7 +116,7 @@ public Class<?> type() {
116116
* @implNote use deferred buffer creation instead of {@link Mono#just(Object)} and {@link Flux#just(Object)} to avoid memory
117117
* leaks
118118
*/
119-
static EncodedParameter create(Format format, PostgresqlObjectId type, Publisher<? extends ByteBuf> value) {
119+
static EncodedParameter create(Format format, PostgresTypeIdentifier type, Publisher<? extends ByteBuf> value) {
120120
Assert.requireNonNull(type, "type must not be null");
121121
return new EncodedParameter(format, type.getObjectId(), value);
122122
}
@@ -125,40 +125,52 @@ static EncodedParameter create(Format format, PostgresqlObjectId type, Publisher
125125
* Create a {@link EncodedParameter}.
126126
*
127127
* @param format the format to use
128-
* @param type the well-known {@link PostgresqlObjectId type OID}
128+
* @param type the well-known {@link PostgresTypeIdentifier type OID}
129129
* @param bufferSupplier {@link Supplier} supplying the encoded {@link ByteBuf buffer}
130130
* @return the encoded {@link EncodedParameter}
131131
*/
132-
static EncodedParameter create(Format format, PostgresqlObjectId type, Supplier<? extends ByteBuf> bufferSupplier) {
132+
static EncodedParameter create(Format format, PostgresTypeIdentifier type, Supplier<? extends ByteBuf> bufferSupplier) {
133133
Assert.requireNonNull(type, "type must not be null");
134-
return new EncodedParameter(format, type.getObjectId(), Mono.fromSupplier(bufferSupplier));
134+
return create(format, type.getObjectId(), bufferSupplier);
135+
}
136+
137+
/**
138+
* Create a {@link EncodedParameter}.
139+
*
140+
* @param format the format to use
141+
* @param type the well-known type OID
142+
* @param bufferSupplier {@link Supplier} supplying the encoded {@link ByteBuf buffer}
143+
* @return the encoded {@link EncodedParameter}
144+
*/
145+
static EncodedParameter create(Format format, int type, Supplier<? extends ByteBuf> bufferSupplier) {
146+
return new EncodedParameter(format, type, Mono.fromSupplier(bufferSupplier));
135147
}
136148

137149
/**
138150
* Encode a {@code null} value.
139151
*
140152
* @param format the data type {@link Format}, text or binary
141-
* @param type the well-known {@link PostgresqlObjectId type OID}
153+
* @param type the well-known {@link PostgresTypeIdentifier type OID}
142154
* @return the encoded {@code null} value
143155
*/
144-
static EncodedParameter createNull(Format format, PostgresqlObjectId type) {
156+
static EncodedParameter createNull(Format format, PostgresTypeIdentifier type) {
145157
return create(format, type, NULL_VALUE);
146158
}
147159

148160
/**
149-
* Determine whether this {@link Codec} is capable of decoding column values based on the given {@link Format} and {@link PostgresqlObjectId}.
161+
* Determine whether this {@link Codec} is capable of decoding column values based on the given {@link Format} and {@link PostgresTypeIdentifier}.
150162
*
151-
* @param type the well-known {@link PostgresqlObjectId type OID}
163+
* @param type the well-known {@link PostgresTypeIdentifier type OID}
152164
* @param format the data type {@link Format}, text or binary
153-
* @return {@code true} if this codec is able to decode values of {@link Format} and {@link PostgresqlObjectId}
165+
* @return {@code true} if this codec is able to decode values of {@link Format} and {@link PostgresTypeIdentifier}
154166
*/
155167
abstract boolean doCanDecode(PostgresqlObjectId type, Format format);
156168

157169
/**
158170
* Decode the {@link ByteBuf data} into the {@link Class value type}.
159171
*
160172
* @param buffer the data buffer
161-
* @param dataType the well-known {@link PostgresqlObjectId type OID}
173+
* @param dataType the well-known {@link PostgresTypeIdentifier type OID}
162174
* @param format data type format
163175
* @param type the desired value type
164176
* @return the decoded value, can be {@code null} if the column value is {@code null}
@@ -177,12 +189,27 @@ static EncodedParameter createNull(Format format, PostgresqlObjectId type) {
177189
* @return the encoded value
178190
* @since 0.9
179191
*/
180-
abstract EncodedParameter doEncode(T value, PostgresqlObjectId dataType);
192+
abstract EncodedParameter doEncode(T value, PostgresTypeIdentifier dataType);
181193

182194
boolean isTypeAssignable(Class<?> type) {
183195
Assert.requireNonNull(type, "type must not be null");
184196

185197
return type.isAssignableFrom(this.type);
186198
}
187199

200+
static class SimplePostgresTypeIdentifier implements PostgresTypeIdentifier {
201+
202+
private final int oid;
203+
204+
public SimplePostgresTypeIdentifier(int oid) {
205+
this.oid = oid;
206+
}
207+
208+
@Override
209+
public int getObjectId() {
210+
return this.oid;
211+
}
212+
213+
}
214+
188215
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ EncodedParameter doEncode(T value) {
8888
}
8989

9090
@Override
91-
EncodedParameter doEncode(T value, PostgresqlObjectId dataType) {
91+
EncodedParameter doEncode(T value, PostgresTypeIdentifier dataType) {
9292
Assert.requireNonNull(value, "value must not be null");
9393

9494
return create(Format.FORMAT_BINARY, dataType, () -> doEncodeBinary(value));

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ EncodedParameter doEncode(T value) {
8181
return doEncode(value, getDefaultType());
8282
}
8383

84-
EncodedParameter doEncode(T value, PostgresqlObjectId dataType) {
84+
EncodedParameter doEncode(T value, PostgresTypeIdentifier dataType) {
8585
Assert.requireNonNull(value, "value must not be null");
8686

8787
if (dataType == NUMERIC) {
@@ -91,9 +91,11 @@ EncodedParameter doEncode(T value, PostgresqlObjectId dataType) {
9191
return create(FORMAT_BINARY, dataType, () -> doEncodeNumber(value, dataType));
9292
}
9393

94-
private ByteBuf doEncodeNumber(Number value, PostgresqlObjectId dataType) {
94+
private ByteBuf doEncodeNumber(Number value, PostgresTypeIdentifier identifier) {
9595

96-
switch (dataType) {
96+
PostgresqlObjectId oid = PostgresqlObjectId.valueOf(identifier.getObjectId());
97+
98+
switch (oid) {
9799

98100
case FLOAT8:
99101
return this.byteBufAllocator.buffer(8).writeDouble(value.doubleValue());
@@ -111,7 +113,7 @@ private ByteBuf doEncodeNumber(Number value, PostgresqlObjectId dataType) {
111113
return this.byteBufAllocator.buffer(4).writeShort(value.shortValue());
112114
}
113115

114-
throw new IllegalArgumentException(String.format("Cannot encode %s to %s", value, dataType));
116+
throw new IllegalArgumentException(String.format("Cannot encode %s to %s", value, oid));
115117

116118
}
117119

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ String doEncodeText(BigDecimal value) {
5151
}
5252

5353
@Override
54-
EncodedParameter encodeArray(Supplier<ByteBuf> encodedSupplier, PostgresqlObjectId dataType) {
54+
EncodedParameter encodeArray(Supplier<ByteBuf> encodedSupplier, PostgresTypeIdentifier dataType) {
5555
return create(Format.FORMAT_TEXT, dataType, encodedSupplier);
5656
}
5757

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ BigDecimal doDecode(ByteBuf buffer, PostgresqlObjectId dataType, @Nullable Forma
4646
}
4747

4848
@Override
49-
EncodedParameter doEncode(BigDecimal value, PostgresqlObjectId dataType) {
49+
EncodedParameter doEncode(BigDecimal value, PostgresTypeIdentifier dataType) {
5050
Assert.requireNonNull(value, "value must not be null");
5151

5252
return create(FORMAT_TEXT, dataType, () -> ByteBufUtils.encode(this.byteBufAllocator, value.toString()));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ byte[] doDecode(ByteBuf buffer, PostgresqlObjectId dataType, Format format, Clas
3737
}
3838

3939
@Override
40-
EncodedParameter doEncode(byte[] value, PostgresqlObjectId dataType) {
40+
EncodedParameter doEncode(byte[] value, PostgresTypeIdentifier dataType) {
4141
Assert.requireNonNull(value, "value must not be null");
4242

4343
return create(FORMAT_TEXT, dataType, () -> encodeToHex(Unpooled.wrappedBuffer(value)));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ ByteBuffer doDecode(ByteBuf buffer, PostgresqlObjectId dataType, Format format,
3838
}
3939

4040
@Override
41-
EncodedParameter doEncode(ByteBuffer value, PostgresqlObjectId dataType) {
41+
EncodedParameter doEncode(ByteBuffer value, PostgresTypeIdentifier dataType) {
4242
return create(FORMAT_TEXT, dataType, () -> encodeToHex(Unpooled.wrappedBuffer(value)));
4343
}
4444

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ EncodedParameter doEncode(Blob value) {
6767
}
6868

6969
@Override
70-
EncodedParameter doEncode(Blob value, PostgresqlObjectId dataType) {
70+
EncodedParameter doEncode(Blob value, PostgresTypeIdentifier dataType) {
7171
Assert.requireNonNull(value, "value must not be null");
7272

7373
return create(FORMAT_TEXT, dataType,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ EncodedParameter doEncode(Boolean value) {
7272
}
7373

7474
@Override
75-
EncodedParameter doEncode(Boolean value, PostgresqlObjectId dataType) {
75+
EncodedParameter doEncode(Boolean value, PostgresTypeIdentifier dataType) {
7676
Assert.requireNonNull(value, "value must not be null");
7777

7878
return create(FORMAT_TEXT, dataType, () -> ByteBufUtils.encode(this.byteBufAllocator, value ? "TRUE" : "FALSE"));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ EncodedParameter doEncode(Byte value) {
6262
}
6363

6464
@Override
65-
EncodedParameter doEncode(Byte value, PostgresqlObjectId dataType) {
65+
EncodedParameter doEncode(Byte value, PostgresTypeIdentifier dataType) {
6666
return this.delegate.doEncode((short) value, dataType);
6767
}
6868

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ EncodedParameter doEncode(Character value) {
6262
}
6363

6464
@Override
65-
EncodedParameter doEncode(Character value, PostgresqlObjectId dataType) {
65+
EncodedParameter doEncode(Character value, PostgresTypeIdentifier dataType) {
6666
Assert.requireNonNull(value, "value must not be null");
6767

6868
return this.delegate.doEncode(value.toString(), dataType);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ EncodedParameter doEncode(Clob value) {
6666
}
6767

6868
@Override
69-
EncodedParameter doEncode(Clob value, PostgresqlObjectId dataType) {
69+
EncodedParameter doEncode(Clob value, PostgresTypeIdentifier dataType) {
7070
Assert.requireNonNull(value, "value must not be null");
7171

7272
return create(FORMAT_TEXT, dataType,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ EncodedParameter doEncode(Date value) {
6767
}
6868

6969
@Override
70-
EncodedParameter doEncode(Date value, PostgresqlObjectId dataType) {
70+
EncodedParameter doEncode(Date value, PostgresTypeIdentifier dataType) {
7171
Assert.requireNonNull(value, "value must not be null");
7272

7373
return this.delegate.doEncode(normalize(value), dataType);

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public <T> T decode(@Nullable ByteBuf buffer, int dataType, Format format, Class
166166
public EncodedParameter encode(Object value) {
167167
Assert.requireNonNull(value, "value must not be null");
168168

169-
int dataType = -1;
169+
PostgresTypeIdentifier dataType = null;
170170
Object parameterValue = value;
171171

172172
if (value instanceof Parameter) {
@@ -181,15 +181,15 @@ public EncodedParameter encode(Object value) {
181181
if (parameter.getType() instanceof R2dbcTypes) {
182182

183183
PostgresqlObjectId targetType = PostgresqlObjectId.valueOf((R2dbcTypes) parameter.getType());
184-
dataType = targetType.getObjectId();
184+
dataType = targetType;
185185
}
186186

187187
if (parameter.getType() instanceof PostgresTypeIdentifier) {
188-
dataType = ((PostgresTypeIdentifier) parameter.getType()).getObjectId();
188+
dataType = (PostgresTypeIdentifier) parameter.getType();
189189
}
190190
}
191191

192-
if (dataType == -1) {
192+
if (dataType == null) {
193193

194194
if (parameterValue == null) {
195195
throw new IllegalArgumentException(String.format("Cannot encode null value %s using type inference", value));
@@ -203,14 +203,13 @@ public EncodedParameter encode(Object value) {
203203
} else {
204204

205205
if (parameterValue == null) {
206-
return new EncodedParameter(Format.FORMAT_BINARY, dataType, NULL_VALUE);
207-
} else {
206+
return new EncodedParameter(Format.FORMAT_BINARY, dataType.getObjectId(), NULL_VALUE);
207+
}
208208

209-
for (Codec<?> codec : this.codecs) {
209+
for (Codec<?> codec : this.codecs) {
210210

211-
if (codec.canEncode(parameterValue)) {
212-
return codec.encode(parameterValue, dataType);
213-
}
211+
if (codec.canEncode(parameterValue)) {
212+
return codec.encode(parameterValue, dataType.getObjectId());
214213
}
215214
}
216215
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ EncodedParameter doEncode(InetAddress value) {
8383
}
8484

8585
@Override
86-
EncodedParameter doEncode(InetAddress value, PostgresqlObjectId dataType) {
86+
EncodedParameter doEncode(InetAddress value, PostgresTypeIdentifier dataType) {
8787
Assert.requireNonNull(value, "value must not be null");
8888

8989
return create(FORMAT_TEXT, dataType, () -> ByteBufUtils.encode(this.byteBufAllocator, value.getHostAddress()));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ EncodedParameter doEncode(Instant value) {
7171
}
7272

7373
@Override
74-
EncodedParameter doEncode(Instant value, PostgresqlObjectId dataType) {
74+
EncodedParameter doEncode(Instant value, PostgresTypeIdentifier dataType) {
7575
Assert.requireNonNull(value, "value must not be null");
7676

7777
return create(FORMAT_TEXT, dataType, () -> ByteBufUtils.encode(this.byteBufAllocator, value.toString()));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Integer doDecodeText(String text) {
4343
}
4444

4545
@Override
46-
EncodedParameter encodeArray(Supplier<ByteBuf> encodedSupplier, PostgresqlObjectId dataType) {
46+
EncodedParameter encodeArray(Supplier<ByteBuf> encodedSupplier, PostgresTypeIdentifier dataType) {
4747
return create(FORMAT_TEXT, dataType, encodedSupplier);
4848
}
4949

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ EncodedParameter doEncode(Interval value) {
5454
}
5555

5656
@Override
57-
EncodedParameter doEncode(Interval value, PostgresqlObjectId dataType) {
57+
EncodedParameter doEncode(Interval value, PostgresTypeIdentifier dataType) {
5858
Assert.requireNonNull(value, "value must not be null");
5959

6060
return create(FORMAT_TEXT, dataType,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ byte[] doDecode(ByteBuf buffer, PostgresqlObjectId dataType, Format format, Clas
4343
}
4444

4545
@Override
46-
EncodedParameter doEncode(byte[] value, PostgresqlObjectId dataType) {
46+
EncodedParameter doEncode(byte[] value, PostgresTypeIdentifier dataType) {
4747
Assert.requireNonNull(value, "value must not be null");
4848

4949
return create(FORMAT_TEXT, JSON, () -> this.byteBufAllocator.buffer(value.length).writeBytes(value));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ EncodedParameter doEncode(ByteBuf value) {
4646
}
4747

4848
@Override
49-
EncodedParameter doEncode(ByteBuf value, PostgresqlObjectId dataType) {
49+
EncodedParameter doEncode(ByteBuf value, PostgresTypeIdentifier dataType) {
5050
Assert.requireNonNull(value, "value must not be null");
5151

5252
return create(FORMAT_BINARY, dataType, () -> {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ ByteBuffer doDecode(ByteBuf buffer, PostgresqlObjectId dataType, Format format,
4646
}
4747

4848
@Override
49-
EncodedParameter doEncode(ByteBuffer value, PostgresqlObjectId dataType) {
49+
EncodedParameter doEncode(ByteBuffer value, PostgresTypeIdentifier dataType) {
5050
Assert.requireNonNull(value, "value must not be null");
5151

5252
return create(FORMAT_TEXT, dataType, () -> this.byteBufAllocator.buffer(value.remaining()).writeBytes(value));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ EncodedParameter doEncode(Json value) {
6767
}
6868

6969
@Override
70-
EncodedParameter doEncode(Json value, PostgresqlObjectId dataType) {
70+
EncodedParameter doEncode(Json value, PostgresTypeIdentifier dataType) {
7171
Assert.requireNonNull(value, "value must not be null");
7272
if (!(value instanceof Json.JsonInput || value instanceof Json.JsonOutput)) {
7373
throw new IllegalArgumentException("value must be JsonInput or JsonOutput");

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ EncodedParameter doEncode(InputStream value) {
5151
}
5252

5353
@Override
54-
EncodedParameter doEncode(InputStream value, PostgresqlObjectId dataType) {
54+
EncodedParameter doEncode(InputStream value, PostgresTypeIdentifier dataType) {
5555
Assert.requireNonNull(value, "value must not be null");
5656

5757
return create(FORMAT_BINARY, dataType, () -> doEncode(value, this.byteBufAllocator));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ EncodedParameter doEncode(String value) {
4646
}
4747

4848
@Override
49-
EncodedParameter doEncode(String value, PostgresqlObjectId dataType) {
49+
EncodedParameter doEncode(String value, PostgresTypeIdentifier dataType) {
5050
Assert.requireNonNull(value, "value must not be null");
5151

5252
return create(FORMAT_TEXT, dataType, () -> ByteBufUtils.encode(this.byteBufAllocator, value));

0 commit comments

Comments
 (0)