From f832758b7f7a6ed3e862b87c19aa51484bdb20c1 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 7 Aug 2020 15:05:13 +0200 Subject: [PATCH] [jOOQ/jOOQ#681] Added DOMAIN support for Firebird --- .../jooq/meta/firebird/FirebirdDatabase.java | 47 +++++++++++++++++++ .../firebird/FirebirdTableDefinition.java | 37 ++++++++------- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java index f29ea326c5..3589c75fc1 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdDatabase.java @@ -37,6 +37,7 @@ */ package org.jooq.meta.firebird; +import static org.jooq.impl.DSL.any; import static org.jooq.impl.DSL.choose; import static org.jooq.impl.DSL.decode; import static org.jooq.impl.DSL.falseCondition; @@ -50,6 +51,7 @@ import static org.jooq.impl.DSL.trim; import static org.jooq.impl.DSL.when; import static org.jooq.impl.DSL.zero; import static org.jooq.meta.firebird.rdb.Tables.RDB$CHECK_CONSTRAINTS; +import static org.jooq.meta.firebird.rdb.Tables.RDB$FIELDS; import static org.jooq.meta.firebird.rdb.Tables.RDB$GENERATORS; import static org.jooq.meta.firebird.rdb.Tables.RDB$INDEX_SEGMENTS; import static org.jooq.meta.firebird.rdb.Tables.RDB$INDICES; @@ -82,6 +84,7 @@ import org.jooq.meta.CatalogDefinition; import org.jooq.meta.DataTypeDefinition; import org.jooq.meta.DefaultCheckConstraintDefinition; import org.jooq.meta.DefaultDataTypeDefinition; +import org.jooq.meta.DefaultDomainDefinition; import org.jooq.meta.DefaultIndexColumnDefinition; import org.jooq.meta.DefaultRelations; import org.jooq.meta.DefaultSequenceDefinition; @@ -103,6 +106,7 @@ import org.jooq.meta.firebird.rdb.tables.Rdb$refConstraints; import org.jooq.meta.firebird.rdb.tables.Rdb$relationConstraints; import org.jooq.meta.firebird.rdb.tables.Rdb$triggers; import org.jooq.meta.jaxb.SchemaMappingType; +import org.jooq.tools.StringUtils; import org.jooq.util.firebird.FirebirdDataType; /** @@ -460,6 +464,49 @@ public class FirebirdDatabase extends AbstractDatabase { @Override protected List getDomains0() throws SQLException { List result = new ArrayList<>(); + + Rdb$fields f = RDB$FIELDS; + + for (Record record : create() + .select( + trim(f.RDB$FIELD_NAME).as(f.RDB$FIELD_NAME), + + CHARACTER_LENGTH(f).as("CHAR_LEN"), + f.RDB$FIELD_PRECISION, + FIELD_SCALE(f).as("FIELD_SCALE"), + FIELD_TYPE(f).as("FIELD_TYPE"), + DSL.bitOr(f.RDB$NULL_FLAG.nvl((short) 0), f.RDB$NULL_FLAG.nvl((short) 0)).as(f.RDB$NULL_FLAG), + trim(f.RDB$VALIDATION_SOURCE).as(f.RDB$VALIDATION_SOURCE), + trim(f.RDB$DEFAULT_SOURCE).as(f.RDB$DEFAULT_SOURCE)) + .from(f) + .where(f.RDB$FIELD_NAME.notLike(any("RDB$%", "SEC$%", "MON$%"))) + .orderBy(f.RDB$FIELD_NAME) + ) { + SchemaDefinition schema = getSchemata().get(0); + + DataTypeDefinition baseType = new DefaultDataTypeDefinition( + this, + schema, + record.get("FIELD_TYPE", String.class), + record.get("CHAR_LEN", short.class), + record.get(f.RDB$FIELD_PRECISION), + record.get("FIELD_SCALE", Integer.class), + record.get(f.RDB$NULL_FLAG) == 0, + record.get(f.RDB$DEFAULT_SOURCE) == null ? null : record.get(f.RDB$DEFAULT_SOURCE).replaceAll("(?i:default )", "") + ); + + DefaultDomainDefinition domain = new DefaultDomainDefinition( + schema, + record.get(f.RDB$FIELD_NAME), + baseType + ); + + if (!StringUtils.isBlank(record.get(f.RDB$VALIDATION_SOURCE))) + domain.addCheckClause(record.get(f.RDB$VALIDATION_SOURCE).replaceAll("(?i:check )", "")); + + result.add(domain); + } + return result; } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdTableDefinition.java index 9198d71d46..8fb7837510 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/firebird/FirebirdTableDefinition.java @@ -37,6 +37,7 @@ */ package org.jooq.meta.firebird; +import static org.jooq.impl.DSL.trim; import static org.jooq.meta.firebird.FirebirdDatabase.CHARACTER_LENGTH; import static org.jooq.meta.firebird.FirebirdDatabase.FIELD_SCALE; import static org.jooq.meta.firebird.FirebirdDatabase.FIELD_TYPE; @@ -85,7 +86,7 @@ public class FirebirdTableDefinition extends AbstractTableDefinition { // DatabaseMetaData implementation for (Record record : create() .select( - r.RDB$FIELD_NAME.trim(), + trim(r.RDB$FIELD_NAME).as(r.RDB$FIELD_NAME), r.RDB$DESCRIPTION, r.RDB$DEFAULT_VALUE, DSL.bitOr(r.RDB$NULL_FLAG.nvl((short) 0), f.RDB$NULL_FLAG.nvl((short) 0)).as(r.RDB$NULL_FLAG), @@ -97,13 +98,12 @@ public class FirebirdTableDefinition extends AbstractTableDefinition { f.RDB$FIELD_PRECISION, FIELD_SCALE(f).as("FIELD_SCALE"), FIELD_TYPE(f).as("FIELD_TYPE"), - f.RDB$FIELD_SUB_TYPE, + trim(f.RDB$FIELD_NAME).as("DOMAIN_NAME"), r.RDB$DESCRIPTION) .from(r) .leftOuterJoin(f).on(r.RDB$FIELD_SOURCE.eq(f.RDB$FIELD_NAME)) .where(r.RDB$RELATION_NAME.eq(getName())) - .orderBy(r.RDB$FIELD_POSITION) - .fetch()) { + .orderBy(r.RDB$FIELD_POSITION)) { // [#9411] Firebird reports the DEFAULT keyword in this column, which // we do not want to reproduce in generated code. @@ -112,23 +112,24 @@ public class FirebirdTableDefinition extends AbstractTableDefinition { defaultValue = P_DEFAULT.matcher(defaultValue).replaceFirst(""); DefaultDataTypeDefinition type = new DefaultDataTypeDefinition( - getDatabase(), - getSchema(), - record.get("FIELD_TYPE", String.class), - record.get("CHAR_LEN", short.class), - record.get(f.RDB$FIELD_PRECISION), - record.get("FIELD_SCALE", Integer.class), - record.get(r.RDB$NULL_FLAG) == 0, - defaultValue + getDatabase(), + getSchema(), + record.get("FIELD_TYPE", String.class), + record.get("CHAR_LEN", short.class), + record.get(f.RDB$FIELD_PRECISION), + record.get("FIELD_SCALE", Integer.class), + record.get(r.RDB$NULL_FLAG) == 0, + defaultValue, + record.get("DOMAIN_NAME") == null ? null : DSL.name(record.get("DOMAIN_NAME", String.class)) ); ColumnDefinition column = new DefaultColumnDefinition( - getDatabase().getTable(getSchema(), getName()), - record.get(r.RDB$FIELD_NAME.trim()), - record.get(r.RDB$FIELD_POSITION), - type, - false, - record.get(r.RDB$DESCRIPTION) + getDatabase().getTable(getSchema(), getName()), + record.get(r.RDB$FIELD_NAME), + record.get(r.RDB$FIELD_POSITION), + type, + false, + record.get(r.RDB$DESCRIPTION) ); result.add(column);