[jOOQ/jOOQ#681] Added DOMAIN support for Firebird

This commit is contained in:
Lukas Eder 2020-08-07 15:05:13 +02:00
parent e11b1f4b9e
commit f832758b7f
2 changed files with 66 additions and 18 deletions

View File

@ -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<DomainDefinition> getDomains0() throws SQLException {
List<DomainDefinition> 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;
}

View File

@ -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);