From ef39b04e187b4baad30f48affed70952f4550af5 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 17 Nov 2014 11:50:49 +0100 Subject: [PATCH] [#3369] Render CAST(? AS DATE) for java.sql.Timestamp bind values that are bound to Oracle DATE columns --- .../java/org/jooq/util/JavaGenerator.java | 67 ++++++++--------- .../util/AbstractTypedElementDefinition.java | 13 +++- .../org/jooq/util/DataTypeDefinition.java | 6 ++ .../jooq/util/DefaultDataTypeDefinition.java | 11 +++ .../main/resources/xsd/jooq-codegen-3.5.0.xsd | 5 +- .../java/org/jooq/impl/AbstractRoutine.java | 63 +++++++++++----- .../java/org/jooq/impl/AbstractTable.java | 29 ++++++-- .../java/org/jooq/impl/ArrayRecordImpl.java | 44 ++++++++--- .../org/jooq/impl/DateAsTimestampBinding.java | 13 ++-- .../java/org/jooq/impl/DefaultBinding.java | 74 +++++++++++++++++-- .../java/org/jooq/impl/DefaultDataType.java | 2 +- jOOQ/src/main/java/org/jooq/impl/UDTImpl.java | 26 +++++-- 12 files changed, 248 insertions(+), 105 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index 6b1caf5ab2..2e09e6c97d 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -1082,18 +1082,14 @@ public class JavaGenerator extends AbstractGenerator { final String attrId = getStrategy().getJavaIdentifier(attribute); final String attrName = attribute.getName(); final String attrComment = StringUtils.defaultString(attribute.getComment()); - final String attrConverterType = attribute.getType().getConverter(); + final List converters = list( + attribute.getType().getConverter(), + attribute.getType().getBinding() + ); out.tab(1).javadoc("The attribute %s.%s", attribute.getQualifiedOutputName(), defaultIfBlank(" " + attrComment, "")); - - if (attrConverterType != null) { - out.tab(1).println("public static final %s<%s, %s> %s = createField(\"%s\", %s, %s, \"%s\", new %s());", - UDTField.class, recordType, attrType, attrId, attrName, attrTypeRef, udtId, escapeString(""), attrConverterType); - } - else { - out.tab(1).println("public static final %s<%s, %s> %s = createField(\"%s\", %s, %s, \"%s\");", - UDTField.class, recordType, attrType, attrId, attrName, attrTypeRef, udtId, escapeString("")); - } + out.tab(1).println("public static final %s<%s, %s> %s = createField(\"%s\", %s, %s, \"%s\"[[before=, ][new %s()]]);", + UDTField.class, recordType, attrType, attrId, attrName, attrTypeRef, udtId, escapeString(""), converters); } // [#799] Oracle UDT's can have member procedures @@ -1310,7 +1306,10 @@ public class JavaGenerator extends AbstractGenerator { xxxxx xxxxxxxxxxxx xxxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxx xxxxx xxxxxx xxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxx xxxxx xxxxxx xxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - xxxxx xxxxxx xxxxxxxxxxxxxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxx xxxxxxxxxxxx xxxxxxxxxx x xxxxx + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xx xxxxxxxxxx xxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxxxx @@ -1325,11 +1324,7 @@ public class JavaGenerator extends AbstractGenerator { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxx xxx xxxxxxxxxx xxxxxxxxxxxxxxxxxxxxx - xx xxxxxxxxxxxxxxxxxxxxx xx xxxxx - xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx - xxxx - xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxxx - + xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxxxxxxxxxxxxx xxxxx xxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x xxxxx x xxxxxxx x xxx xxx xxxxxx xxxxxx xxxxxxxxxxx xxxxxxxxx xxxxxxxxxxx @@ -1349,11 +1344,7 @@ public class JavaGenerator extends AbstractGenerator { xxxxxxxxxxxxxxxxxxxxxxxxxx x xxx xxxxxxxxxxxxxxx xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxx xxxx xxx xxxxxxxxxxx - - xx xxxxxxxxxxxxxxxxxxxxx xx xxxxx - xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx - xxxx - xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxx xxxxx xxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxx @@ -2071,21 +2062,17 @@ public class JavaGenerator extends AbstractGenerator { final String columnId = getStrategy().getJavaIdentifier(column); final String columnName = column.getName(); final String columnComment = StringUtils.defaultString(column.getComment()); - final String columnConverterType = column.getType().getConverter(); + final List converters = list( + column.getType().getConverter(), + column.getType().getBinding() + ); String isStatic = generateInstanceFields() ? "" : "static "; String tableRef = generateInstanceFields() ? "this" : getStrategy().getJavaIdentifier(table); out.tab(1).javadoc("The column %s.%s", column.getQualifiedOutputName(), defaultIfBlank(" " + columnComment, "")); - - if (columnConverterType != null) { - out.tab(1).println("public %sfinal %s<%s, %s> %s = createField(\"%s\", %s, %s, \"%s\", new %s());", - isStatic, TableField.class, recordType, columnType, columnId, columnName, columnTypeRef, tableRef, escapeString(columnComment), columnConverterType); - } - else { - out.tab(1).println("public %sfinal %s<%s, %s> %s = createField(\"%s\", %s, %s, \"%s\");", - isStatic, TableField.class, recordType, columnType, columnId, columnName, columnTypeRef, tableRef, escapeString(columnComment)); - } + out.tab(1).println("public %sfinal %s<%s, %s> %s = createField(\"%s\", %s, %s, \"%s\"[[before=, ][new %s()]]);", + isStatic, TableField.class, recordType, columnType, columnId, columnName, columnTypeRef, tableRef, escapeString(columnComment), converters); } // [#1255] With instance fields, the table constructor may @@ -2571,9 +2558,14 @@ public class JavaGenerator extends AbstractGenerator { final List returnTypeRef = list((routine.getReturnValue() != null) ? getJavaTypeReference(database, routine.getReturnType()) : null); - final List returnConverterType = list((routine.getReturnValue() != null) + final List returnConverterType = list( + (routine.getReturnValue() != null) ? routine.getReturnType().getConverter() - : null); + : null, + (routine.getReturnValue() != null) + ? routine.getReturnType().getBinding() + : null + ); final List interfaces = getStrategy().getJavaClassImplements(routine, Mode.DEFAULT); final String schemaId = getStrategy().getFullJavaIdentifier(schema); final List packageId = getStrategy().getFullJavaIdentifiers(routine.getPackage()); @@ -3377,12 +3369,13 @@ public class JavaGenerator extends AbstractGenerator { return getJavaType(type1).equals(getJavaType(type2)); } - private static final List list(T object) { + private static final List list(T... objects) { List result = new ArrayList(); - if (object != null && !"".equals(object)) { - result.add(object); - } + if (objects != null) + for (T object : objects) + if (object != null && !"".equals(object)) + result.add(object); return result; } diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractTypedElementDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractTypedElementDefinition.java index 32c5705d60..a91fa1953e 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractTypedElementDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractTypedElementDefinition.java @@ -131,7 +131,7 @@ abstract class AbstractTypedElementDefinition if (dataType != null) { if (dataType.getSQLType() == Types.DATE) { DataType forcedDataType = DefaultDataType.getDataType(db.getDialect(), SQLDataType.TIMESTAMP.getTypeName(), 0, 0); - result = new DefaultDataTypeDefinition(db, child.getSchema(), forcedDataType.getTypeName(), 0, 0, 0, result.isNullable(), result.isDefaulted(), null, DateAsTimestampBinding.class.getName()); + result = new DefaultDataTypeDefinition(db, child.getSchema(), forcedDataType.getTypeName(), 0, 0, 0, result.isNullable(), result.isDefaulted(), null, null, DateAsTimestampBinding.class.getName()); } } } @@ -141,6 +141,7 @@ abstract class AbstractTypedElementDefinition if (forcedType != null) { String type = forcedType.getName(); String converter = null; + String binding = result.getBinding(); CustomType customType = customType(db, forcedType.getName()); if (customType != null) { @@ -148,7 +149,11 @@ abstract class AbstractTypedElementDefinition ? customType.getType() : customType.getName(); - converter = customType.getConverter(); + if (!StringUtils.isBlank(customType.getConverter())) + converter = customType.getConverter(); + + if (!StringUtils.isBlank(customType.getBinding())) + binding = customType.getBinding(); } @@ -180,7 +185,7 @@ abstract class AbstractTypedElementDefinition // [#677] SQLDataType matches are actual type-rewrites if (forcedDataType != null) { - result = new DefaultDataTypeDefinition(db, child.getSchema(), type, l, p, s, n, d, null, converter); + result = new DefaultDataTypeDefinition(db, child.getSchema(), type, l, p, s, n, d, null, converter, binding); } // Other forced types are UDT's, enums, etc. @@ -189,7 +194,7 @@ abstract class AbstractTypedElementDefinition p = result.getPrecision(); s = result.getScale(); String t = result.getType(); - result = new DefaultDataTypeDefinition(db, child.getSchema(), t, l, p, s, n, d, type, converter); + result = new DefaultDataTypeDefinition(db, child.getSchema(), t, l, p, s, n, d, type, converter, binding); } } diff --git a/jOOQ-meta/src/main/java/org/jooq/util/DataTypeDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/DataTypeDefinition.java index d6a785f2e2..89de5e08c5 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/DataTypeDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/DataTypeDefinition.java @@ -59,6 +59,12 @@ public interface DataTypeDefinition { */ String getConverter(); + /** + * The binding type that is applied to this data type, or + * null, if no such binding type is configured. + */ + String getBinding(); + /** * The type's length. */ diff --git a/jOOQ-meta/src/main/java/org/jooq/util/DefaultDataTypeDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/DefaultDataTypeDefinition.java index 2b4dcafab0..1867700bed 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/DefaultDataTypeDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/DefaultDataTypeDefinition.java @@ -57,6 +57,7 @@ public class DefaultDataTypeDefinition implements DataTypeDefinition { private final String typeName; private final String udtName; private final String converter; + private final String binding; private final boolean nullable; private final boolean defaulted; private final int length; @@ -76,6 +77,10 @@ public class DefaultDataTypeDefinition implements DataTypeDefinition { } public DefaultDataTypeDefinition(Database database, SchemaDefinition schema, String typeName, Number length, Number precision, Number scale, Boolean nullable, Boolean defaultable, String udtName, String converter) { + this(database, schema, typeName, length, precision, scale, nullable, defaultable, udtName, converter, null); + } + + public DefaultDataTypeDefinition(Database database, SchemaDefinition schema, String typeName, Number length, Number precision, Number scale, Boolean nullable, Boolean defaultable, String udtName, String converter, String binding) { this.database = database; this.schema = schema; @@ -83,6 +88,7 @@ public class DefaultDataTypeDefinition implements DataTypeDefinition { this.typeName = typeName == null ? "OTHER" : typeName; this.udtName = udtName; this.converter = converter; + this.binding = binding; // Some dialects do not distinguish between length and precision... if (length != null && precision != null && length.intValue() != 0 && precision.intValue() != 0) { @@ -144,6 +150,11 @@ public class DefaultDataTypeDefinition implements DataTypeDefinition { return converter; } + @Override + public final String getBinding() { + return binding; + } + @Override public final int getLength() { return length; diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.5.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.5.0.xsd index 79aadc57f8..193760b7c7 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.5.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.5.0.xsd @@ -560,7 +560,10 @@ - + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index 7ff2c9b371..e10470af77 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -137,35 +137,44 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro // ------------------------------------------------------------------------ protected AbstractRoutine(String name, Schema schema) { - this(name, schema, null, null, (Binding) null); + this(name, schema, null, null, null, null); } protected AbstractRoutine(String name, Schema schema, Package pkg) { - this(name, schema, pkg, null, (Binding) null); + this(name, schema, pkg, null, null, null); } protected AbstractRoutine(String name, Schema schema, DataType type) { - this(name, schema, null, type, (Binding) null); + this(name, schema, null, type, null, null); } - protected AbstractRoutine(String name, Schema schema, DataType type, Converter converter) { - this(name, schema, type, DefaultBinding.newBinding(converter, type)); + protected AbstractRoutine(String name, Schema schema, DataType type, Converter converter) { + this(name, schema, null, type, converter, null); } - protected AbstractRoutine(String name, Schema schema, DataType type, Binding converter) { - this(name, schema, null, type, converter); + protected AbstractRoutine(String name, Schema schema, DataType type, Binding binding) { + this(name, schema, null, type, null, binding); + } + + + protected AbstractRoutine(String name, Schema schema, DataType type, Converter converter, Binding binding) { + this(name, schema, null, type, converter, binding); } protected AbstractRoutine(String name, Schema schema, Package pkg, DataType type) { - this(name, schema, pkg, type, (Binding) null); + this(name, schema, pkg, type, null, null); } - protected AbstractRoutine(String name, Schema schema, Package pkg, DataType type, Converter converter) { - this(name, schema, pkg, type, DefaultBinding.newBinding(converter, type)); + protected AbstractRoutine(String name, Schema schema, Package pkg, DataType type, Converter converter) { + this(name, schema, pkg, type, converter, null); + } + + protected AbstractRoutine(String name, Schema schema, Package pkg, DataType type, Binding binding) { + this(name, schema, pkg, type, null, binding); } @SuppressWarnings({ "unchecked", "rawtypes" }) - protected AbstractRoutine(String name, Schema schema, Package pkg, DataType type, Binding binding) { + protected AbstractRoutine(String name, Schema schema, Package pkg, DataType type, Converter converter, Binding binding) { this.parameterIndexes = new HashMap, Integer>(); this.schema = schema; @@ -179,9 +188,9 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro this.inValuesDefaulted = new HashSet>(); this.inValuesNonDefaulted = new HashSet>(); this.outValues = new HashMap, Object>(); - this.type = binding == null + this.type = converter == null && binding == null ? (DataType) type - : type.asConvertedDataType((Binding) binding); + : type.asConvertedDataType(DefaultBinding.newBinding((Converter) converter, type, binding)); } // ------------------------------------------------------------------------ @@ -761,7 +770,7 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro * @param type The data type of the field */ protected static final Parameter createParameter(String name, DataType type) { - return createParameter(name, type, false, (Binding) null); + return createParameter(name, type, false, null, null); } /** @@ -774,7 +783,7 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro * {@link Parameter#isDefaulted()} */ protected static final Parameter createParameter(String name, DataType type, boolean isDefaulted) { - return createParameter(name, type, isDefaulted, (Binding) null); + return createParameter(name, type, isDefaulted, null, null); } /** @@ -787,7 +796,20 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro * {@link Parameter#isDefaulted()} */ protected static final Parameter createParameter(String name, DataType type, boolean isDefaulted, Converter converter) { - return createParameter(name, type, isDefaulted, DefaultBinding.newBinding(converter, type)); + return createParameter(name, type, isDefaulted, converter, null); + } + + /** + * Subclasses may call this method to create {@link UDTField} objects that + * are linked to this table. + * + * @param name The name of the field (case-sensitive!) + * @param type The data type of the field + * @param isDefaulted Whether the parameter is defaulted (see + * {@link Parameter#isDefaulted()} + */ + protected static final Parameter createParameter(String name, DataType type, boolean isDefaulted, Binding binding) { + return createParameter(name, type, isDefaulted, null, binding); } /** @@ -800,12 +822,13 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro * {@link Parameter#isDefaulted()} */ @SuppressWarnings("unchecked") - protected static final Parameter createParameter(String name, DataType type, boolean isDefaulted, Binding binding) { - final DataType actualType = binding == null + protected static final Parameter createParameter(String name, DataType type, boolean isDefaulted, Converter converter, Binding binding) { + final Binding actualBinding = DefaultBinding.newBinding(converter, type, binding); + final DataType actualType = converter == null && binding == null ? (DataType) type - : type.asConvertedDataType(binding); + : type.asConvertedDataType(actualBinding); - return new ParameterImpl(name, actualType, isDefaulted, binding); + return new ParameterImpl(name, actualType, isDefaulted, actualBinding); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 46b32adbc3..c3dca7c4ea 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -321,7 +321,7 @@ abstract class AbstractTable extends AbstractQueryPart impleme * @param type The data type of the field */ protected static final TableField createField(String name, DataType type, Table table) { - return createField(name, type, table, null, (Binding) null); + return createField(name, type, table, null, null, null); } /** @@ -332,7 +332,7 @@ abstract class AbstractTable extends AbstractQueryPart impleme * @param type The data type of the field */ protected static final TableField createField(String name, DataType type, Table table, String comment) { - return createField(name, type, table, comment, (Binding) null); + return createField(name, type, table, comment, null, null); } /** @@ -343,7 +343,18 @@ abstract class AbstractTable extends AbstractQueryPart impleme * @param type The data type of the field */ protected static final TableField createField(String name, DataType type, Table table, String comment, Converter converter) { - return createField(name, type, table, comment, DefaultBinding.newBinding(converter, type)); + return createField(name, type, table, comment, converter, null); + } + + /** + * Subclasses may call this method to create {@link TableField} objects that + * are linked to this table. + * + * @param name The name of the field (case-sensitive!) + * @param type The data type of the field + */ + protected static final TableField createField(String name, DataType type, Table table, String comment, Binding binding) { + return createField(name, type, table, comment, null, binding); } /** @@ -354,12 +365,14 @@ abstract class AbstractTable extends AbstractQueryPart impleme * @param type The data type of the field */ @SuppressWarnings("unchecked") - protected static final TableField createField(String name, DataType type, Table table, String comment, Binding binding) { - final DataType actualType = binding == null - ? (DataType) type - : type.asConvertedDataType(binding); + protected static final TableField createField(String name, DataType type, Table table, String comment, Converter converter, Binding binding) { + final Binding actualBinding = DefaultBinding.newBinding(converter, type, binding); + final DataType actualType = + converter == null && binding == null + ? (DataType) type + : type.asConvertedDataType(actualBinding); - final TableFieldImpl tableField = new TableFieldImpl(name, actualType, table, comment, binding); + final TableFieldImpl tableField = new TableFieldImpl(name, actualType, table, comment, actualBinding); // [#1199] The public API of Table returns immutable field lists if (table instanceof TableImpl) { diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java index 3fba64ca88..b2ffab3ae9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java @@ -89,7 +89,7 @@ xxxxxx xxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxx xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxx x - xxxxxxxxxxxx xxxxx xxxxxx + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxxxx xxx xxxxx xxxxxx x xxx @@ -101,8 +101,8 @@ xxxxxx xxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxx - xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxx xx xxxxxxxxxx x - xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxx + xxxxxxxxx xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxx xx xxxxxxxxxx x + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxx xxxxxx x xxx @@ -114,36 +114,56 @@ xxxxxx xxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxx xx xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxx - xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxx xx xxxxxxxx x - xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxx + xxxxxxxxx xxx xx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxx xx xxxxxxxx x + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxxxx xxx xxxxx xxxxxxxxx + x + + xxx + x xxxxxx xx xxxxx xxxxx xxxxxx + x + x xxxxxxxxxxx x xxxxx x xxxxxxx x xxx xxx + x xxxxxx xxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxx xxxxxxxxxxx + x xxxxxxxxxxx xxxxxxxx + xx + xxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxx + xxxxxxxxx xxx xx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxx xx xxxxxxxxxx xxxxxxxxxx xx xxxxxxxx x + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxx xxxxxxxxx x xxx x xxxxxx xx xxxxx xxxxx xxxxxx xx xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx x - xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxxxx xxx xxxxxx + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxxxx xxx xxxxx xxxxxx x xxx x xxxxxx xx xxxxx xxxxx xxxxxx xx - xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxx xx xxxxxxxxxx x - xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx + xxxxxxxxx xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxx xx xxxxxxxxxx x + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxx xxxxxx x xxx x xxxxxx xx xxxxx xxxxx xxxxxx xx - xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xx - xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxx xx xxxxxxxx x + xxxxxxxxx xxx xx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxx xx xxxxxxxx x + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxxxx xxx xxxxx xxxxxxxxx + x + + xxx + x xxxxxx xx xxxxx xxxxx xxxxxx + xx + xxxxxxxxxxxxxxxxxxx xxxxxxxxxxx xx + xxxxxxxxx xxx xx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxx xx xxxxxxxxxx xxxxxxxxxx xx xxxxxxxx x xxxxxxxxxxxx xxxxxxxxxxx x xxxxxxx xxxxxxxxx x xxxxx - xxxxxxxxxxxxx x xxxxxxx xx xxxx + xxxxxxxxxxxxx x xxxxxxxxx xx xxxx xx xxxxxxx xx xxxx x xxxxxxxxxxxxx xxxx - x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx + x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxx xxxxxxxxxx xx xxxxx xxxx xxxx xxxxxxxxxxxxxx xxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx diff --git a/jOOQ/src/main/java/org/jooq/impl/DateAsTimestampBinding.java b/jOOQ/src/main/java/org/jooq/impl/DateAsTimestampBinding.java index c4785b7339..49dfdfbd5d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DateAsTimestampBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DateAsTimestampBinding.java @@ -41,7 +41,7 @@ package org.jooq.impl; // ... -import static org.jooq.conf.ParamType.INLINED; +import static org.jooq.impl.DSL.val; import java.sql.SQLException; import java.sql.Timestamp; @@ -96,13 +96,10 @@ public class DateAsTimestampBinding implements Binding { xx xxxx xx xxxx xx xxxxxxx xxxxxxxx xxxxxxxxxx xx xxxx xxxxxxx xx xxxxxxxxx xxx xxxxxxxxxxxxxxxxxxxx xx xxxxx xxxxx xxxxxxx xxxxx xxxxxx xx xxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - xx xxxxxxx xx xxxxxx xx xxxxxxxxxxxxxxxxxx xx xxxxxxxx x - xxxxxxxxxxxxxxxxxxxxxx - xxxxxxxxx - xxxxxxxxxxxxxxxxxxxx - xxxxxx xx - xxxxxxxxxxxx xxxxxx - xxxxxxxxxx + xx xxxxxxx xx xxxxxxx x + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxxxx x xxxx xx [/pro] */ diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 40b1bc3971..c9d16c2cd2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -103,6 +103,7 @@ import org.jooq.BindingSetStatementContext; import org.jooq.Configuration; import org.jooq.Context; import org.jooq.Converter; +import org.jooq.Converters; import org.jooq.DataType; import org.jooq.EnumType; import org.jooq.Field; @@ -160,13 +161,72 @@ public class DefaultBinding implements Binding { } @SuppressWarnings({ "rawtypes", "unchecked" }) - static DefaultBinding newBinding(Converter converter, DataType type) { - return new DefaultBinding( - converter != null - ? converter - : new IdentityConverter(type.getType()), - type.isLob() - ); + static Binding newBinding(final Converter converter, final DataType type, final Binding binding) { + final Binding theBinding; + + + if (converter == null && binding == null) { + theBinding = (Binding) new DefaultBinding(new IdentityConverter(type.getType()), type.isLob()); + } + else if (converter == null) { + theBinding = (Binding) binding; + } + else if (binding == null) { + theBinding = (Binding) new DefaultBinding(converter, type.isLob()); + } + else { + theBinding = new Binding() { + + /** + * Generated UID + */ + private static final long serialVersionUID = 8912340791845209886L; + + final Converter theConverter = Converters.of(binding.converter(), converter); + + @Override + public Converter converter() { + return theConverter; + } + + @Override + public void sql(BindingSQLContext ctx) throws SQLException { + binding.sql(ctx.convert(converter)); + } + + @Override + public void register(BindingRegisterContext ctx) throws SQLException { + binding.register(ctx.convert(converter)); + } + + @Override + public void set(BindingSetStatementContext ctx) throws SQLException { + binding.set(ctx.convert(converter)); + } + + @Override + public void set(BindingSetSQLOutputContext ctx) throws SQLException { + binding.set(ctx.convert(converter)); + } + + @Override + public void get(BindingGetResultSetContext ctx) throws SQLException { + binding.get(ctx.convert(converter)); + } + + @Override + public void get(BindingGetStatementContext ctx) throws SQLException { + binding.get(ctx.convert(converter)); + } + + @Override + public void get(BindingGetSQLInputContext ctx) throws SQLException { + binding.get(ctx.convert(converter)); + } + }; + } + + return theBinding; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java index 2ceb1f7fbe..9f5db0f987 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java @@ -587,7 +587,7 @@ public class DefaultDataType implements DataType { @Override public final DataType asConvertedDataType(Converter converter) { - return asConvertedDataType(DefaultBinding.newBinding((Converter) converter, this)); + return asConvertedDataType(DefaultBinding.newBinding(converter, this, null)); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java b/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java index cf1f5aabca..d60efe5b82 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java @@ -163,7 +163,7 @@ public class UDTImpl> extends AbstractQueryPart implement * @param type The data type of the field */ protected static final , T> UDTField createField(String name, DataType type, UDT udt) { - return createField(name, type, udt, "", (Binding) null); + return createField(name, type, udt, "", null, null); } /** @@ -174,7 +174,7 @@ public class UDTImpl> extends AbstractQueryPart implement * @param type The data type of the field */ protected static final , T> UDTField createField(String name, DataType type, UDT udt, String comment) { - return createField(name, type, udt, comment, (Binding) null); + return createField(name, type, udt, comment, null, null); } /** @@ -185,7 +185,18 @@ public class UDTImpl> extends AbstractQueryPart implement * @param type The data type of the field */ protected static final , T, U> UDTField createField(String name, DataType type, UDT udt, String comment, Converter converter) { - return createField(name, type, udt, comment, DefaultBinding.newBinding(converter, type)); + return createField(name, type, udt, comment, converter, null); + } + + /** + * Subclasses may call this method to create {@link UDTField} objects that + * are linked to this table. + * + * @param name The name of the field (case-sensitive!) + * @param type The data type of the field + */ + protected static final , T, U> UDTField createField(String name, DataType type, UDT udt, String comment, Binding binding) { + return createField(name, type, udt, comment, null, binding); } /** @@ -196,12 +207,13 @@ public class UDTImpl> extends AbstractQueryPart implement * @param type The data type of the field */ @SuppressWarnings("unchecked") - protected static final , T, U> UDTField createField(String name, DataType type, UDT udt, String comment, Binding binding) { - final DataType actualType = binding == null + protected static final , T, X, U> UDTField createField(String name, DataType type, UDT udt, String comment, Converter converter, Binding binding) { + final Binding actualBinding = DefaultBinding.newBinding(converter, type, binding); + final DataType actualType = converter == null && binding == null ? (DataType) type - : type.asConvertedDataType(binding); + : type.asConvertedDataType(actualBinding); - final UDTFieldImpl udtField = new UDTFieldImpl(name, actualType, udt, comment, binding); + final UDTFieldImpl udtField = new UDTFieldImpl(name, actualType, udt, comment, actualBinding); return udtField; }