From 7cd606cd2f4aa110cb735c076ba45416981e64cc Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 23 Feb 2021 14:40:26 +0100 Subject: [PATCH] [jOOQ/jOOQ#11504] Default[UnsignedType]Bindings should delegate to integer bindings, rather than implement their own This includes: - [jOOQ/jOOQ#11505] Deprecate DateToLocalDateConverter, TimeToLocalTimeConverter, TimestampToLocalDateTimeConverter --- .../org/jooq/impl/CreateFunctionImpl.java | 4 + .../jooq/impl/DateToLocalDateConverter.java | 7 + .../java/org/jooq/impl/DefaultBinding.java | 307 ++++-------------- .../jooq/impl/TimeToLocalTimeConverter.java | 7 + .../TimestampToLocalDateTimeConverter.java | 7 + 5 files changed, 95 insertions(+), 237 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateFunctionImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateFunctionImpl.java index 10ba475155..59bc4c222c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateFunctionImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateFunctionImpl.java @@ -297,6 +297,10 @@ package org.jooq.impl; + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/DateToLocalDateConverter.java b/jOOQ/src/main/java/org/jooq/impl/DateToLocalDateConverter.java index e2719ec601..d72cdbb92e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DateToLocalDateConverter.java +++ b/jOOQ/src/main/java/org/jooq/impl/DateToLocalDateConverter.java @@ -40,9 +40,16 @@ package org.jooq.impl; import java.sql.Date; import java.time.LocalDate; +import org.jooq.Converter; + /** * @author Lukas Eder + * @deprecated - 3.15.0 - [#11505] - Use + * {@link Converter#ofNullable(Class, Class, java.util.function.Function, java.util.function.Function)} + * instead, e.g. + * Converter.ofNullable(Date.class, LocalDate.class, Date::toLocalDate, Date::valueOf). */ +@Deprecated public final class DateToLocalDateConverter extends AbstractConverter { /** diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index a90003f606..9a2e81dd82 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -102,13 +102,17 @@ import static org.jooq.impl.Keywords.K_TIME_WITH_TIME_ZONE; import static org.jooq.impl.Keywords.K_TRUE; import static org.jooq.impl.Keywords.K_YEAR_TO_DAY; import static org.jooq.impl.Keywords.K_YEAR_TO_FRACTION; +import static org.jooq.impl.SQLDataType.BIGINT; import static org.jooq.impl.SQLDataType.BLOB; import static org.jooq.impl.SQLDataType.CHAR; import static org.jooq.impl.SQLDataType.DATE; +import static org.jooq.impl.SQLDataType.DECIMAL_INTEGER; import static org.jooq.impl.SQLDataType.DOUBLE; +import static org.jooq.impl.SQLDataType.INTEGER; import static org.jooq.impl.SQLDataType.LONGVARCHAR; import static org.jooq.impl.SQLDataType.OTHER; import static org.jooq.impl.SQLDataType.ROWID; +import static org.jooq.impl.SQLDataType.SMALLINT; import static org.jooq.impl.SQLDataType.TIME; import static org.jooq.impl.SQLDataType.TIMESTAMP; import static org.jooq.impl.SQLDataType.VARCHAR; @@ -281,24 +285,27 @@ public class DefaultBinding implements Binding { return new DefaultJSONBBinding(dataType, converter); else if (type == XML.class) return new DefaultXMLBinding(dataType, converter); - else if (type == LocalDate.class) { - DateToLocalDateConverter c1 = new DateToLocalDateConverter(); - Converter c2 = (Converter) converter; - Converter c3 = Converters.of(c1, c2); - return (Binding) new DelegatingBinding<>((DataType) dataType, c1, c2, new DefaultDateBinding<>(DATE, c3)); - } - else if (type == LocalDateTime.class) { - TimestampToLocalDateTimeConverter c1 = new TimestampToLocalDateTimeConverter(); - Converter c2 = (Converter) converter; - Converter c3 = Converters.of(c1, c2); - return (Binding) new DelegatingBinding<>((DataType) dataType, c1, c2, new DefaultTimestampBinding<>(TIMESTAMP, c3)); - } - else if (type == LocalTime.class) { - TimeToLocalTimeConverter c1 = new TimeToLocalTimeConverter(); - Converter c2 = (Converter) converter; - Converter c3 = Converters.of(c1, c2); - return (Binding) new DelegatingBinding<>((DataType) dataType, c1, c2, new DefaultTimeBinding<>(TIME, c3)); - } + else if (type == LocalDate.class) + return (Binding) new DelegatingBinding<>( + (DataType) dataType, + serializableConverter(Date.class, LocalDate.class, Date::toLocalDate, Date::valueOf), + (Converter) converter, + c -> new DefaultDateBinding<>(DATE, c) + ); + else if (type == LocalDateTime.class) + return (Binding) new DelegatingBinding<>( + (DataType) dataType, + serializableConverter(Timestamp.class, LocalDateTime.class, Timestamp::toLocalDateTime, Timestamp::valueOf), + (Converter) converter, + c -> new DefaultTimestampBinding<>(TIMESTAMP, c) + ); + else if (type == LocalTime.class) + return (Binding) new DelegatingBinding<>( + (DataType) dataType, + serializableConverter(Time.class, LocalTime.class, Time::toLocalTime, Time::valueOf), + (Converter) converter, + c -> new DefaultTimeBinding<>(TIME, c) + ); else if (type == Long.class || type == long.class) return new DefaultLongBinding(dataType, converter); else if (type == OffsetDateTime.class) @@ -324,13 +331,33 @@ public class DefaultBinding implements Binding { else if (type == java.util.Date.class) return new DefaultTimestampBinding(dataType, Converters.of(TimestampToJavaUtilDateConverter.INSTANCE, (Converter) converter)); else if (type == UByte.class) - return new DefaultUByteBinding(dataType, converter); + return (Binding) new DelegatingBinding<>( + (DataType) dataType, + serializableConverter(Short.class, UByte.class, UByte::valueOf, UByte::shortValue), + (Converter) converter, + c -> new DefaultShortBinding<>(SMALLINT, c) + ); else if (type == UInteger.class) - return new DefaultUIntegerBinding(dataType, converter); + return (Binding) new DelegatingBinding<>( + (DataType) dataType, + serializableConverter(Long.class, UInteger.class, UInteger::valueOf, UInteger::longValue), + (Converter) converter, + c -> new DefaultLongBinding<>(BIGINT, c) + ); else if (type == ULong.class) - return new DefaultULongBinding(dataType, converter); + return (Binding) new DelegatingBinding<>( + (DataType) dataType, + serializableConverter(BigInteger.class, ULong.class, ULong::valueOf, ULong::toBigInteger), + (Converter) converter, + c -> new DefaultBigIntegerBinding<>(DECIMAL_INTEGER, c) + ); else if (type == UShort.class) - return new DefaultUShortBinding(dataType, converter); + return (Binding) new DelegatingBinding<>( + (DataType) dataType, + serializableConverter(Integer.class, UShort.class, UShort::valueOf, UShort::intValue), + (Converter) converter, + c -> new DefaultIntegerBinding<>(INTEGER, c) + ); else if (type == UUID.class) return new DefaultUUIDBinding(dataType, converter); else if (type == YearToSecond.class) @@ -969,12 +996,12 @@ public class DefaultBinding implements Binding { DataType originalDataType, Converter delegatingConverter, Converter originalConverter, - AbstractBinding delegatingBinding + Function, ? extends AbstractBinding> f ) { super(originalDataType, originalConverter); this.delegatingConverter = delegatingConverter; - this.delegatingBinding = delegatingBinding; + this.delegatingBinding = f.apply(Converters.of(delegatingConverter, originalConverter)); } @Override @@ -3148,11 +3175,11 @@ public class DefaultBinding implements Binding { */ private static final long serialVersionUID = -1850495302106551527L; - private static final Converter CONVERTER = Converter.ofNullable( + private static final Converter CONVERTER = serializableConverter( OffsetDateTime.class, Instant.class, - (Function & Serializable) o -> o.toInstant(), - (Function & Serializable) i -> OffsetDateTime.ofInstant(i, ZoneOffset.UTC) + OffsetDateTime::toInstant, + i -> OffsetDateTime.ofInstant(i, ZoneOffset.UTC) ); private final DefaultOffsetDateTimeBinding delegate; @@ -4136,216 +4163,6 @@ public class DefaultBinding implements Binding { } } - static final class DefaultUByteBinding extends AbstractBinding { - - /** - * Generated UID - */ - private static final long serialVersionUID = -101167998250685198L; - - DefaultUByteBinding(DataType dataType, Converter converter) { - super(dataType, converter); - } - - @Override - final void sqlInline0(BindingSQLContext ctx, UByte value) { - ctx.render().sql(value.toString()); - } - - @Override - final void set0(BindingSetStatementContext ctx, UByte value) throws SQLException { - ctx.statement().setShort(ctx.index(), value.shortValue()); - } - - @Override - final void set0(BindingSetSQLOutputContext ctx, UByte value) throws SQLException { - ctx.output().writeShort(value.shortValue()); - } - - @Override - final UByte get0(BindingGetResultSetContext ctx) throws SQLException { - String string = ctx.resultSet().getString(ctx.index()); - return string == null ? null : UByte.valueOf(string); - } - - @Override - final UByte get0(BindingGetStatementContext ctx) throws SQLException { - String string = ctx.statement().getString(ctx.index()); - return string == null ? null : UByte.valueOf(string); - } - - @Override - final UByte get0(BindingGetSQLInputContext ctx) throws SQLException { - String string = ctx.input().readString(); - return string == null ? null : UByte.valueOf(string); - } - - @Override - final int sqltype(Statement statement, Configuration configuration) { - return Types.SMALLINT; - } - } - - static final class DefaultUIntegerBinding extends AbstractBinding { - - /** - * Generated UID - */ - private static final long serialVersionUID = 1437279656720185207L; - - DefaultUIntegerBinding(DataType dataType, Converter converter) { - super(dataType, converter); - } - - @Override - final void sqlInline0(BindingSQLContext ctx, UInteger value) { - ctx.render().sql(value.toString()); - } - - @Override - final void set0(BindingSetStatementContext ctx, UInteger value) throws SQLException { - - - - - - ctx.statement().setLong(ctx.index(), value.longValue()); - } - - @Override - final void set0(BindingSetSQLOutputContext ctx, UInteger value) throws SQLException { - ctx.output().writeLong(value.longValue()); - } - - @Override - final UInteger get0(BindingGetResultSetContext ctx) throws SQLException { - String string = ctx.resultSet().getString(ctx.index()); - return string == null ? null : UInteger.valueOf(string); - } - - @Override - final UInteger get0(BindingGetStatementContext ctx) throws SQLException { - String string = ctx.statement().getString(ctx.index()); - return string == null ? null : UInteger.valueOf(string); - } - - @Override - final UInteger get0(BindingGetSQLInputContext ctx) throws SQLException { - String string = ctx.input().readString(); - return string == null ? null : UInteger.valueOf(string); - } - - @Override - final int sqltype(Statement statement, Configuration configuration) { - return Types.BIGINT; - } - } - - static final class DefaultULongBinding extends AbstractBinding { - - /** - * Generated UID - */ - private static final long serialVersionUID = 4891128447530113299L; - - DefaultULongBinding(DataType dataType, Converter converter) { - super(dataType, converter); - } - - @Override - final void sqlInline0(BindingSQLContext ctx, ULong value) { - ctx.render().sql(value.toString()); - } - - @Override - final void set0(BindingSetStatementContext ctx, ULong value) throws SQLException { - - - - - - ctx.statement().setBigDecimal(ctx.index(), new BigDecimal(value.toString())); - } - - @Override - final void set0(BindingSetSQLOutputContext ctx, ULong value) throws SQLException { - ctx.output().writeBigDecimal(new BigDecimal(value.toString())); - } - - @Override - final ULong get0(BindingGetResultSetContext ctx) throws SQLException { - String string = ctx.resultSet().getString(ctx.index()); - return string == null ? null : ULong.valueOf(string); - } - - @Override - final ULong get0(BindingGetStatementContext ctx) throws SQLException { - String string = ctx.statement().getString(ctx.index()); - return string == null ? null : ULong.valueOf(string); - } - - @Override - final ULong get0(BindingGetSQLInputContext ctx) throws SQLException { - String string = ctx.input().readString(); - return string == null ? null : ULong.valueOf(string); - } - - @Override - final int sqltype(Statement statement, Configuration configuration) { - return Types.DECIMAL; - } - } - - static final class DefaultUShortBinding extends AbstractBinding { - - /** - * Generated UID - */ - private static final long serialVersionUID = 2539811197808516971L; - - DefaultUShortBinding(DataType dataType, Converter converter) { - super(dataType, converter); - } - - @Override - final void sqlInline0(BindingSQLContext ctx, UShort value) { - ctx.render().sql(value.toString()); - } - - @Override - final void set0(BindingSetStatementContext ctx, UShort value) throws SQLException { - ctx.statement().setInt(ctx.index(), value.intValue()); - } - - @Override - final void set0(BindingSetSQLOutputContext ctx, UShort value) throws SQLException { - ctx.output().writeInt(value.intValue()); - } - - @Override - final UShort get0(BindingGetResultSetContext ctx) throws SQLException { - String string = ctx.resultSet().getString(ctx.index()); - return string == null ? null : UShort.valueOf(string); - } - - @Override - final UShort get0(BindingGetStatementContext ctx) throws SQLException { - String string = ctx.statement().getString(ctx.index()); - return string == null ? null : UShort.valueOf(string); - } - - @Override - final UShort get0(BindingGetSQLInputContext ctx) throws SQLException { - String string = ctx.input().readString(); - return string == null ? null : UShort.valueOf(string); - } - - @Override - final int sqltype(Statement statement, Configuration configuration) { - return Types.INTEGER; - } - } - static final class DefaultUUIDBinding extends AbstractBinding { /** @@ -4831,5 +4648,21 @@ public class DefaultBinding implements Binding { return Types.VARCHAR; } } + + /** + * Create a serializable converter. + */ + static final < + T, U, + FTU extends Function & Serializable, + FUT extends Function & Serializable + > Converter serializableConverter( + Class fromType, + Class toType, + FTU from, + FUT to + ) { + return Converter.ofNullable(fromType, toType, from, to); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/TimeToLocalTimeConverter.java b/jOOQ/src/main/java/org/jooq/impl/TimeToLocalTimeConverter.java index a29485c18a..fa18aea7b1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TimeToLocalTimeConverter.java +++ b/jOOQ/src/main/java/org/jooq/impl/TimeToLocalTimeConverter.java @@ -40,9 +40,16 @@ package org.jooq.impl; import java.sql.Time; import java.time.LocalTime; +import org.jooq.Converter; + /** * @author Lukas Eder + * @deprecated - 3.15.0 - [#11505] - Use + * {@link Converter#ofNullable(Class, Class, java.util.function.Function, java.util.function.Function)} + * instead, e.g. + * Converter.ofNullable(Time.class, LocalTime.class, Time::toLocalTime, Time::valueOf). */ +@Deprecated public final class TimeToLocalTimeConverter extends AbstractConverter { /** diff --git a/jOOQ/src/main/java/org/jooq/impl/TimestampToLocalDateTimeConverter.java b/jOOQ/src/main/java/org/jooq/impl/TimestampToLocalDateTimeConverter.java index 6a6b51998e..4f0c4fcf49 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TimestampToLocalDateTimeConverter.java +++ b/jOOQ/src/main/java/org/jooq/impl/TimestampToLocalDateTimeConverter.java @@ -40,9 +40,16 @@ package org.jooq.impl; import java.sql.Timestamp; import java.time.LocalDateTime; +import org.jooq.Converter; + /** * @author Lukas Eder + * @deprecated - 3.15.0 - [#11505] - Use + * {@link Converter#ofNullable(Class, Class, java.util.function.Function, java.util.function.Function)} + * instead, e.g. + * Converter.ofNullable(Timestamp.class, LocalDateTime.class, Timestamp::toLocalDateTime, Timestamp::valueOf). */ +@Deprecated public final class TimestampToLocalDateTimeConverter extends AbstractConverter { /**