From 3633b53f1ef0490c1f7ffbb98429df4eb498ab35 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 30 Sep 2019 09:41:01 +0200 Subject: [PATCH] [jOOQ/jOOQ#6497] Add LocalDateAsLocalDateTimeBinding to make and work together --- .../java/org/jooq/codegen/GenerationTool.java | 2 + .../java/org/jooq/meta/AbstractDatabase.java | 11 ++ .../meta/AbstractTypedElementDefinition.java | 10 +- .../src/main/java/org/jooq/meta/Database.java | 12 ++ .../impl/LocalDateAsLocalDateTimeBinding.java | 139 ++++++++++++++++++ 5 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 jOOQ/src/main/java/org/jooq/impl/LocalDateAsLocalDateTimeBinding.java diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java index f9d95c3c14..1df150fb28 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -602,6 +602,8 @@ public class GenerationTool { if (d.isDateAsTimestamp() != null) database.setDateAsTimestamp(d.isDateAsTimestamp()); + if (g.getGenerate().isJavaTimeTypes() != null) + database.setJavaTimeTypes(g.getGenerate().isJavaTimeTypes()); if (d.isUnsignedTypes() != null) database.setSupportsUnsignedTypes(d.isUnsignedTypes()); if (d.isIntegerDisplayWidths() != null) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java index f0c1ef1e1a..4005a23f6e 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -149,6 +149,7 @@ public abstract class AbstractDatabase implements Database { private boolean integerDisplayWidths; private boolean ignoreProcedureReturnValues; private boolean dateAsTimestamp; + private boolean javaTimeTypes = true; private List configuredCatalogs = new ArrayList<>(); private List configuredSchemata = new ArrayList<>(); private List configuredCustomTypes; @@ -1364,6 +1365,16 @@ public abstract class AbstractDatabase implements Database { return dateAsTimestamp; } + @Override + public final void setJavaTimeTypes(boolean javaTimeTypes) { + this.javaTimeTypes = javaTimeTypes; + } + + @Override + public final boolean javaTimeTypes() { + return javaTimeTypes; + } + @Override public final void setIncludeRelations(boolean includeRelations) { this.includeRelations = includeRelations; diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java index e6bc0a42c6..1bd20edd1e 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java @@ -54,6 +54,7 @@ import org.jooq.exception.SQLDialectNotSupportedException; import org.jooq.impl.DateAsTimestampBinding; import org.jooq.impl.DefaultDataType; import org.jooq.impl.EnumConverter; +import org.jooq.impl.LocalDateAsLocalDateTimeBinding; import org.jooq.impl.SQLDataType; import org.jooq.meta.jaxb.CustomType; import org.jooq.meta.jaxb.ForcedType; @@ -187,7 +188,14 @@ public abstract class AbstractTypedElementDefinition // [#5239] [#5762] [#6453] Don't rely on getSQLType() if (SQLDataType.DATE.equals(dataType.getSQLDataType())) { DataType forcedDataType = getDataType(db, SQLDataType.TIMESTAMP.getTypeName(), 0, 0); - result = new DefaultDataTypeDefinition(db, child.getSchema(), forcedDataType.getTypeName(), 0, 0, 0, result.isNullable(), result.getDefaultValue(), (Name) null, null, DateAsTimestampBinding.class.getName()); + result = new DefaultDataTypeDefinition( + db, + child.getSchema(), + forcedDataType.getTypeName(), + 0, 0, 0, + result.isNullable(), result.getDefaultValue(), (Name) null, null, + db.javaTimeTypes() ? LocalDateAsLocalDateTimeBinding.class.getName() : DateAsTimestampBinding.class.getName() + ); } } } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java index 5c1ce1dfd0..027ca955fd 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java @@ -884,6 +884,18 @@ public interface Database extends AutoCloseable { */ boolean dateAsTimestamp(); + /** + * Whether java.time types are used, as opposed to + * java.sql types. + */ + void setJavaTimeTypes(boolean javaTimeTypes); + + /** + * Whether java.time types are used, as opposed to + * java.sql types. + */ + boolean javaTimeTypes(); + /** * [#3559] Whether relations (i.e. constraints) should be included in this database. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/LocalDateAsLocalDateTimeBinding.java b/jOOQ/src/main/java/org/jooq/impl/LocalDateAsLocalDateTimeBinding.java new file mode 100644 index 0000000000..adee04b8b4 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/LocalDateAsLocalDateTimeBinding.java @@ -0,0 +1,139 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq.impl; + +// ... +import static org.jooq.impl.DSL.val; +import static org.jooq.impl.Keywords.K_AS; +import static org.jooq.impl.Keywords.K_CAST; +import static org.jooq.impl.Keywords.K_DATE; + +import java.sql.SQLException; +import java.time.LocalDateTime; + +import org.jooq.Binding; +import org.jooq.BindingGetResultSetContext; +import org.jooq.BindingGetSQLInputContext; +import org.jooq.BindingGetStatementContext; +import org.jooq.BindingRegisterContext; +import org.jooq.BindingSQLContext; +import org.jooq.BindingSetSQLOutputContext; +import org.jooq.BindingSetStatementContext; +import org.jooq.Converter; +import org.jooq.Converters; +import org.jooq.RenderContext; +import org.jooq.SQLDialect; + +/** + * A binding that implements the date-as-timestamp semantics of the jOOQ code + * generator. + * + * @author Lukas Eder + * @see https://github.com/jOOQ/jOOQ/issues/3369 + */ +public class LocalDateAsLocalDateTimeBinding implements Binding { + + /** + * Generated UID + */ + private static final long serialVersionUID = -7730882831126647188L; + + private final Converter converter; + private final Binding delegate; + + public LocalDateAsLocalDateTimeBinding() { + this.converter = Converters.identity(LocalDateTime.class); + this.delegate = DefaultBinding.binding(converter); + } + + @Override + public final Converter converter() { + return converter; + } + + @Override + public final void sql(BindingSQLContext ctx) throws SQLException { + + + + + + + + + + + + + + + + delegate.sql(ctx); + } + + @Override + public final void register(BindingRegisterContext ctx) throws SQLException { + delegate.register(ctx); + } + + @Override + public final void set(BindingSetStatementContext ctx) throws SQLException { + delegate.set(ctx); + } + + @Override + public final void set(BindingSetSQLOutputContext ctx) throws SQLException { + delegate.set(ctx); + } + + @Override + public final void get(BindingGetResultSetContext ctx) throws SQLException { + delegate.get(ctx); + } + + @Override + public final void get(BindingGetStatementContext ctx) throws SQLException { + delegate.get(ctx); + } + + @Override + public final void get(BindingGetSQLInputContext ctx) throws SQLException { + delegate.get(ctx); + } +}