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 45de7885a9..0aa6e39879 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -59,6 +59,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -219,6 +220,7 @@ public abstract class AbstractDatabase implements Database { // Loaded definitions // ------------------------------------------------------------------------- + private Map sources; private List inputCatalogs; private List inputSchemata; private Map> inputSchemataPerCatalog; @@ -598,6 +600,19 @@ public abstract class AbstractDatabase implements Database { return false; } + @Override + public final Map getSources() { + if (sources == null) { + sources = new LinkedHashMap<>(); + onError(ERROR, "Could not load sources", () -> { + sources = getSources0(); + log.info("Sequences fetched", fetchedSize(sources.values(), sources.values())); + }); + } + + return sources; + } + @Override public final List getCatalogs() { if (catalogs == null) { @@ -2702,7 +2717,7 @@ public abstract class AbstractDatabase implements Database { return false; } - protected static final String fetchedSize(List fetched, List included) { + protected static final String fetchedSize(Collection fetched, Collection included) { return fetched.size() + " (" + included.size() + " included, " + (fetched.size() - included.size()) + " excluded)"; } @@ -3080,6 +3095,13 @@ public abstract class AbstractDatabase implements Database { */ protected abstract DSLContext create0(); + /** + * Retrieve ALL source code from the database. + */ + protected Map getSources0() throws SQLException { + return new LinkedHashMap<>(); + } + /** * Retrieve ALL indexes from the database */ diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java index 8358d4a4d4..ffcc97926e 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java @@ -72,11 +72,11 @@ public abstract class AbstractDefinition implements Definition { private final String source; // [#2238] Some caches for strings that are heavy to calculate in large schemas - private transient String qualifiedInputName; - private transient String qualifiedOutputName; - private transient Name qualifiedInputNamePart; - private transient Name qualifiedOutputNamePart; - private transient Integer hashCode; + private transient String qualifiedInputName; + private transient String qualifiedOutputName; + private transient Name qualifiedInputNamePart; + private transient Name qualifiedOutputNamePart; + private transient Integer hashCode; public AbstractDefinition(Database database, SchemaDefinition schema, String name) { this(database, schema, name, null); @@ -330,6 +330,6 @@ public abstract class AbstractDefinition implements Definition { @Override public final String getSource() { - return source; + return source != null ? source : getDatabase().getSources().get(this); } } 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 1fa8949543..92b5f1c6af 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java @@ -41,6 +41,7 @@ package org.jooq.meta; import java.sql.Connection; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.Properties; import org.jooq.DSLContext; @@ -71,6 +72,11 @@ import org.jooq.meta.jaxb.SyntheticViewType; */ public interface Database extends AutoCloseable { + /** + * Get the sources for all objects that offer sources. + */ + Map getSources(); + /** * The catalogs generated from this database. */