From 446cce4a746b703ef7d6292769c5a024964cc4c4 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 1 Nov 2018 16:04:10 +0100 Subject: [PATCH] [#7952] Add SQLDataType.INSTANT --- jOOQ/src/main/java/org/jooq/DataType.java | 1 + .../java/org/jooq/impl/DefaultBinding.java | 55 +++++++++++++++++++ .../main/java/org/jooq/impl/SQLDataType.java | 15 +++++ .../java/org/jooq/util/h2/H2DataType.java | 2 + .../org/jooq/util/hsqldb/HSQLDBDataType.java | 2 + .../jooq/util/postgres/PostgresDataType.java | 2 + 6 files changed, 77 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/DataType.java b/jOOQ/src/main/java/org/jooq/DataType.java index 3c064861fb..bbf4e34f69 100644 --- a/jOOQ/src/main/java/org/jooq/DataType.java +++ b/jOOQ/src/main/java/org/jooq/DataType.java @@ -453,6 +453,7 @@ public interface DataType extends Serializable { *
  • {@link SQLDataType#LOCALDATETIME}
  • *
  • {@link SQLDataType#OFFSETTIME}
  • *
  • {@link SQLDataType#OFFSETDATETIME}
  • + *
  • {@link SQLDataType#INSTANT}
  • * */ boolean isDateTime(); diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 5692fa5240..bdf9d7d619 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -114,6 +114,7 @@ import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; import java.text.SimpleDateFormat; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -256,6 +257,8 @@ public class DefaultBinding implements Binding { return new DefaultOffsetDateTimeBinding(converter, isLob); else if (type == OffsetTime.class) return new DefaultOffsetTimeBinding(converter, isLob); + else if (type == Instant.class) + return new DefaultInstantBinding(converter, isLob); else if (type == Short.class || type == short.class) return new DefaultShortBinding(converter, isLob); @@ -2787,6 +2790,58 @@ public class DefaultBinding implements Binding { } } + static final class DefaultInstantBinding extends AbstractBinding { + + /** + * Generated UID + */ + private static final long serialVersionUID = -1850495302106551527L; + private static final Converter CONVERTER = Converter.ofNullable( + OffsetDateTime.class, + Instant.class, + o -> o.toInstant(), + i -> OffsetDateTime.ofInstant(i, ZoneOffset.UTC) + ); + + private final DefaultOffsetDateTimeBinding delegate; + + DefaultInstantBinding(Converter converter, boolean isLob) { + super(converter, isLob); + + delegate = new DefaultOffsetDateTimeBinding(Converters.of(CONVERTER, converter()), isLob); + } + + @Override + final void set0(BindingSetStatementContext ctx, Instant value) throws SQLException { + delegate.set0(ctx, CONVERTER.to(value)); + } + + @Override + final void set0(BindingSetSQLOutputContext ctx, Instant value) throws SQLException { + delegate.set0(ctx, CONVERTER.to(value)); + } + + @Override + final Instant get0(BindingGetResultSetContext ctx) throws SQLException { + return CONVERTER.from(delegate.get0(ctx)); + } + + @Override + final Instant get0(BindingGetStatementContext ctx) throws SQLException { + return CONVERTER.from(delegate.get0(ctx)); + } + + @Override + final Instant get0(BindingGetSQLInputContext ctx) throws SQLException { + return CONVERTER.from(delegate.get0(ctx)); + } + + @Override + final int sqltype(Statement statement, Configuration configuration) throws SQLException { + return delegate.sqltype(statement, configuration); + } + } + static final class DefaultOtherBinding extends AbstractBinding { diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLDataType.java b/jOOQ/src/main/java/org/jooq/impl/SQLDataType.java index bbefa554b8..725f80244b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLDataType.java @@ -44,6 +44,7 @@ import java.sql.ResultSet; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -494,6 +495,20 @@ public final class SQLDataType { return TIMESTAMPWITHTIMEZONE.precision(precision); } + /** + * A {@link Types#TIMESTAMP_WITH_TIMEZONE} type that uses UTC as time zone. + *

    + * Neither JDBC, nor most SQL databases support the INSTANT + * data type, which is often the only kind of timestamp which can be + * expected to behave across all server and client time zone settings. This + * implementation is backed by the database vendor's + * TIMESTAMP WITH TIME ZONE data type implementation, which may + * (e.g. Oracle) or may not (e.g. PostgreSQL) store the timestamp + * information. Irrespective of that storage, this type will always produce + * time zone agnostic instants in client code. + */ + public static final DataType INSTANT = new DefaultDataType(null, Instant.class, "instant"); + // ------------------------------------------------------------------------- // Binary types diff --git a/jOOQ/src/main/java/org/jooq/util/h2/H2DataType.java b/jOOQ/src/main/java/org/jooq/util/h2/H2DataType.java index 43ab353c3d..5de2c651ec 100644 --- a/jOOQ/src/main/java/org/jooq/util/h2/H2DataType.java +++ b/jOOQ/src/main/java/org/jooq/util/h2/H2DataType.java @@ -42,6 +42,7 @@ import java.math.BigInteger; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; +import java.time.Instant; import java.time.OffsetDateTime; import java.util.UUID; @@ -105,6 +106,7 @@ public class H2DataType { public static final DataType DATETIME = new DefaultDataType(SQLDialect.H2, SQLDataType.TIMESTAMP, "datetime"); public static final DataType TIMESTAMPWITHTIMEZONE = new DefaultDataType(SQLDialect.H2, SQLDataType.TIMESTAMPWITHTIMEZONE, "timestamp with time zone"); + public static final DataType INSTANT = new DefaultDataType(SQLDialect.H2, SQLDataType.INSTANT, "timestamp with time zone"); public static final DataType BINARY = new DefaultDataType(SQLDialect.H2, SQLDataType.BINARY, "binary"); public static final DataType VARBINARY = new DefaultDataType(SQLDialect.H2, SQLDataType.VARBINARY, "varbinary"); diff --git a/jOOQ/src/main/java/org/jooq/util/hsqldb/HSQLDBDataType.java b/jOOQ/src/main/java/org/jooq/util/hsqldb/HSQLDBDataType.java index c0e5846dff..d9bf9932d6 100644 --- a/jOOQ/src/main/java/org/jooq/util/hsqldb/HSQLDBDataType.java +++ b/jOOQ/src/main/java/org/jooq/util/hsqldb/HSQLDBDataType.java @@ -43,6 +43,7 @@ import java.math.BigInteger; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; +import java.time.Instant; import java.time.OffsetDateTime; import java.time.OffsetTime; import java.util.UUID; @@ -114,6 +115,7 @@ public class HSQLDBDataType { public static final DataType DATETIME = new DefaultDataType(SQLDialect.HSQLDB, SQLDataType.TIMESTAMP, "datetime"); public static final DataType TIMESTAMPWITHTIMEZONE = new DefaultDataType(SQLDialect.HSQLDB, SQLDataType.TIMESTAMPWITHTIMEZONE, "timestamp with time zone"); + public static final DataType INSTANT = new DefaultDataType(SQLDialect.HSQLDB, SQLDataType.INSTANT, "timestamp with time zone"); public static final DataType LONGVARBINARY = new DefaultDataType(SQLDialect.HSQLDB, SQLDataType.LONGVARBINARY, "longvarbinary"); public static final DataType VARBINARY = new DefaultDataType(SQLDialect.HSQLDB, SQLDataType.VARBINARY, "varbinary", "varbinary(32672)"); diff --git a/jOOQ/src/main/java/org/jooq/util/postgres/PostgresDataType.java b/jOOQ/src/main/java/org/jooq/util/postgres/PostgresDataType.java index 859da3a113..ff14104533 100644 --- a/jOOQ/src/main/java/org/jooq/util/postgres/PostgresDataType.java +++ b/jOOQ/src/main/java/org/jooq/util/postgres/PostgresDataType.java @@ -43,6 +43,7 @@ import java.math.BigInteger; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; +import java.time.Instant; import java.time.OffsetDateTime; import java.time.OffsetTime; import java.util.UUID; @@ -113,6 +114,7 @@ public class PostgresDataType { public static final DataType TIMESTAMPWITHTIMEZONE = new DefaultDataType(SQLDialect.POSTGRES, SQLDataType.TIMESTAMPWITHTIMEZONE, "timestamp with time zone"); public static final DataType TIMESTAMPTZ = new DefaultDataType(SQLDialect.POSTGRES, SQLDataType.TIMESTAMPWITHTIMEZONE, "timestamptz"); + public static final DataType INSTANT = new DefaultDataType(SQLDialect.POSTGRES, SQLDataType.INSTANT, "timestamp with time zone"); public static final DataType BYTEA = new DefaultDataType(SQLDialect.POSTGRES, SQLDataType.BLOB, "bytea"); public static final DataType INTERVALYEARTOMONTH = new DefaultDataType(SQLDialect.POSTGRES, SQLDataType.INTERVALYEARTOMONTH, "interval year to month");