diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java
index d98f0060b7..3e32e36e13 100644
--- a/jOOQ/src/main/java/org/jooq/DSLContext.java
+++ b/jOOQ/src/main/java/org/jooq/DSLContext.java
@@ -239,6 +239,28 @@ public interface DSLContext extends Scope , AutoCloseable {
*/
InformationSchema informationSchema(Schema... schemas);
+ /**
+ * Export a table to the {@link InformationSchema} format.
+ *
+ * Exporting a single table will not include any foreign key definitions in
+ * the exported data.
+ *
+ * This allows for serialising schema meta information as XML using JAXB.
+ * See also {@link Constants#XSD_META} for details.
+ */
+ InformationSchema informationSchema(Table> table);
+
+ /**
+ * Export a set of tables to the {@link InformationSchema} format.
+ *
+ * Only those foreign keys whose referenced table is also included in the
+ * export will be exported.
+ *
+ * This allows for serialising schema meta information as XML using JAXB.
+ * See also {@link Constants#XSD_META} for details.
+ */
+ InformationSchema informationSchema(Table>... table);
+
// -------------------------------------------------------------------------
// XXX APIs for creating scope for transactions, mocking, batching, etc.
// -------------------------------------------------------------------------
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
index 018c2d79d6..872eeab549 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java
@@ -380,7 +380,7 @@ public Meta meta(InformationSchema schema) {
@Override
public InformationSchema informationSchema(Catalog catalog) {
- return informationSchema0(catalog.getSchemas());
+ return InformationSchemaExport.exportSchemas(configuration(), catalog.getSchemas());
}
@Override
@@ -390,21 +390,27 @@ public InformationSchema informationSchema(Catalog... catalogs) {
for (Catalog catalog : catalogs)
schemas.addAll(catalog.getSchemas());
- return informationSchema0(schemas);
+ return InformationSchemaExport.exportSchemas(configuration(), schemas);
}
@Override
public InformationSchema informationSchema(Schema schema) {
- return informationSchema0(Arrays.asList(schema));
+ return InformationSchemaExport.exportSchemas(configuration(), Arrays.asList(schema));
}
@Override
public InformationSchema informationSchema(Schema... schemas) {
- return informationSchema0(Arrays.asList(schemas));
+ return InformationSchemaExport.exportSchemas(configuration(), Arrays.asList(schemas));
}
- private final InformationSchema informationSchema0(List schemas) {
- return InformationSchemaExport.export(configuration(), schemas);
+ @Override
+ public InformationSchema informationSchema(Table> table) {
+ return InformationSchemaExport.exportTables(configuration(), Arrays.asList(table));
+ }
+
+ @Override
+ public InformationSchema informationSchema(Table>... tables) {
+ return InformationSchemaExport.exportTables(configuration(), Arrays.asList(tables));
}
// -------------------------------------------------------------------------
diff --git a/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java b/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java
index a330596c88..8722766c6f 100644
--- a/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java
+++ b/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java
@@ -40,7 +40,9 @@
*/
package org.jooq.impl;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
import org.jooq.Configuration;
import org.jooq.Field;
@@ -56,90 +58,116 @@
*/
final class InformationSchemaExport {
- static final InformationSchema export(Configuration configuration, List schemas) {
+ static final InformationSchema exportTables(Configuration configuration, List> tables) {
+ InformationSchema result = new InformationSchema();
+
+ Set schemas = new LinkedHashSet();
+ for (Table> t : tables)
+ schemas.add(t.getSchema());
+
+ for (Schema s : schemas)
+ exportSchema0(result, s);
+
+ for (Table> t : tables)
+ exportTable0(configuration, result, t);
+
+ return result;
+ }
+
+ static final InformationSchema exportSchemas(Configuration configuration, List schemas) {
InformationSchema result = new InformationSchema();
for (Schema s : schemas) {
- org.jooq.util.xml.jaxb.Schema is = new org.jooq.util.xml.jaxb.Schema();
+ exportSchema0(result, s);
+
+ for (Table> t : s.getTables())
+ exportTable0(configuration, result, t);
- if (!StringUtils.isBlank(s.getCatalog().getName()))
- is.setCatalogName(s.getCatalog().getName());
+ for (Sequence> q : s.getSequences())
+ exportSequences0(configuration, result, q);
+ }
- if (!StringUtils.isBlank(s.getName())) {
- is.setSchemaName(s.getName());
- result.getSchemata().add(is);
- }
+ return result;
+ }
- for (Table> t : s.getTables()) {
- org.jooq.util.xml.jaxb.Table it = new org.jooq.util.xml.jaxb.Table();
+ private static void exportSequences0(Configuration configuration, InformationSchema result, Sequence> q) {
+ org.jooq.util.xml.jaxb.Sequence iq = new org.jooq.util.xml.jaxb.Sequence();
- if (!StringUtils.isBlank(t.getCatalog().getName()))
- it.setTableCatalog(t.getCatalog().getName());
+ if (!StringUtils.isBlank(q.getCatalog().getName()))
+ iq.setSequenceCatalog(q.getCatalog().getName());
- if (!StringUtils.isBlank(t.getSchema().getName()))
- it.setTableSchema(t.getSchema().getName());
+ if (!StringUtils.isBlank(q.getSchema().getName()))
+ iq.setSequenceSchema(q.getSchema().getName());
- it.setTableName(t.getName());
- result.getTables().add(it);
+ iq.setSequenceName(q.getName());
+ iq.setDataType(q.getDataType().getTypeName(configuration));
- Field>[] fields = t.fields();
- for (int i = 0; i < fields.length; i++) {
- Field> f = fields[i];
- Column ic = new Column();
+ if (q.getDataType().hasLength())
+ iq.setCharacterMaximumLength(q.getDataType().length());
- if (!StringUtils.isBlank(t.getCatalog().getName()))
- ic.setTableCatalog(t.getCatalog().getName());
+ if (q.getDataType().hasPrecision())
+ iq.setNumericPrecision(q.getDataType().precision());
- if (!StringUtils.isBlank(t.getSchema().getName()))
- ic.setTableSchema(t.getSchema().getName());
+ if (q.getDataType().hasScale())
+ iq.setNumericScale(q.getDataType().scale());
- ic.setTableName(t.getName());
- ic.setColumnName(t.getName());
- ic.setDataType(f.getDataType().getTypeName(configuration));
+ result.getSequences().add(iq);
+ }
- if (f.getDataType().hasLength())
- ic.setCharacterMaximumLength(f.getDataType().length());
+ private static void exportTable0(Configuration configuration, InformationSchema result, Table> t) {
+ org.jooq.util.xml.jaxb.Table it = new org.jooq.util.xml.jaxb.Table();
- if (f.getDataType().hasPrecision())
- ic.setNumericPrecision(f.getDataType().precision());
+ if (!StringUtils.isBlank(t.getCatalog().getName()))
+ it.setTableCatalog(t.getCatalog().getName());
- if (f.getDataType().hasScale())
- ic.setNumericScale(f.getDataType().scale());
+ if (!StringUtils.isBlank(t.getSchema().getName()))
+ it.setTableSchema(t.getSchema().getName());
- ic.setColumnDefault(DSL.using(configuration).render(f.getDataType().defaultValue()));
- ic.setIsNullable(f.getDataType().nullable());
- ic.setOrdinalPosition(i + 1);
+ it.setTableName(t.getName());
+ result.getTables().add(it);
- result.getColumns().add(ic);
- }
- }
+ Field>[] fields = t.fields();
+ for (int i = 0; i < fields.length; i++) {
+ Field> f = fields[i];
+ Column ic = new Column();
- for (Sequence> q : s.getSequences()) {
- org.jooq.util.xml.jaxb.Sequence iq = new org.jooq.util.xml.jaxb.Sequence();
+ if (!StringUtils.isBlank(t.getCatalog().getName()))
+ ic.setTableCatalog(t.getCatalog().getName());
- if (!StringUtils.isBlank(q.getCatalog().getName()))
- iq.setSequenceCatalog(q.getCatalog().getName());
+ if (!StringUtils.isBlank(t.getSchema().getName()))
+ ic.setTableSchema(t.getSchema().getName());
- if (!StringUtils.isBlank(q.getSchema().getName()))
- iq.setSequenceSchema(q.getSchema().getName());
+ ic.setTableName(t.getName());
+ ic.setColumnName(t.getName());
+ ic.setDataType(f.getDataType().getTypeName(configuration));
- iq.setSequenceName(q.getName());
- iq.setDataType(q.getDataType().getTypeName(configuration));
+ if (f.getDataType().hasLength())
+ ic.setCharacterMaximumLength(f.getDataType().length());
- if (q.getDataType().hasLength())
- iq.setCharacterMaximumLength(q.getDataType().length());
+ if (f.getDataType().hasPrecision())
+ ic.setNumericPrecision(f.getDataType().precision());
- if (q.getDataType().hasPrecision())
- iq.setNumericPrecision(q.getDataType().precision());
+ if (f.getDataType().hasScale())
+ ic.setNumericScale(f.getDataType().scale());
- if (q.getDataType().hasScale())
- iq.setNumericScale(q.getDataType().scale());
+ ic.setColumnDefault(DSL.using(configuration).render(f.getDataType().defaultValue()));
+ ic.setIsNullable(f.getDataType().nullable());
+ ic.setOrdinalPosition(i + 1);
- result.getSequences().add(iq);
- }
+ result.getColumns().add(ic);
}
+ }
- return result;
+ private static final void exportSchema0(InformationSchema result, Schema s) {
+ org.jooq.util.xml.jaxb.Schema is = new org.jooq.util.xml.jaxb.Schema();
+
+ if (!StringUtils.isBlank(s.getCatalog().getName()))
+ is.setCatalogName(s.getCatalog().getName());
+
+ if (!StringUtils.isBlank(s.getName())) {
+ is.setSchemaName(s.getName());
+ result.getSchemata().add(is);
+ }
}
private InformationSchemaExport() {}