All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jooq.impl.InformationSchemaExport Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2009-2016, Data Geekery GmbH (http://www.datageekery.com)
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Other licenses:
 * -----------------------------------------------------------------------------
 * Commercial licenses for this work are available. These replace the above
 * ASL 2.0 and offer limited warranties, support, maintenance, and commercial
 * database integrations.
 *
 * For more information, please visit: http://www.jooq.org/licenses
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
package org.jooq.impl;

import static org.jooq.util.xml.jaxb.TableConstraintType.FOREIGN_KEY;
import static org.jooq.util.xml.jaxb.TableConstraintType.PRIMARY_KEY;
import static org.jooq.util.xml.jaxb.TableConstraintType.UNIQUE;

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.jooq.Configuration;
import org.jooq.Field;
import org.jooq.ForeignKey;
import org.jooq.Key;
import org.jooq.Schema;
import org.jooq.Sequence;
import org.jooq.Table;
import org.jooq.UniqueKey;
import org.jooq.tools.StringUtils;
import org.jooq.util.xml.jaxb.Column;
import org.jooq.util.xml.jaxb.InformationSchema;
import org.jooq.util.xml.jaxb.KeyColumnUsage;
import org.jooq.util.xml.jaxb.ReferentialConstraint;
import org.jooq.util.xml.jaxb.TableConstraint;
import org.jooq.util.xml.jaxb.TableConstraintType;

/**
 * @author Lukas Eder
 */
final class InformationSchemaExport {

    static final InformationSchema exportTables(Configuration configuration, List> tables) {
        InformationSchema result = new InformationSchema();

        Set includedSchemas = new LinkedHashSet();
        Set> includedTables = new LinkedHashSet>(tables);

        for (Table t : tables)
            includedSchemas.add(t.getSchema());

        for (Schema s : includedSchemas)
            exportSchema0(result, s);

        for (Table t : tables)
            exportTable0(configuration, result, t, includedTables);

        return result;
    }

    static final InformationSchema exportSchemas(Configuration configuration, List schemas) {
        InformationSchema result = new InformationSchema();

        Set> includedTables = new LinkedHashSet>();
        for (Schema s : schemas)
            for (Table t : s.getTables())
                includedTables.add(t);

        for (Schema s : schemas) {
            exportSchema0(result, s);

            for (Table t : s.getTables())
                exportTable0(configuration, result, t, includedTables);

            for (Sequence q : s.getSequences())
                exportSequences0(configuration, result, q);
        }

        return result;
    }

    private static final 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(q.getCatalog().getName()))
            iq.setSequenceCatalog(q.getCatalog().getName());

        if (!StringUtils.isBlank(q.getSchema().getName()))
            iq.setSequenceSchema(q.getSchema().getName());

        iq.setSequenceName(q.getName());
        iq.setDataType(q.getDataType().getTypeName(configuration));

        if (q.getDataType().hasLength())
            iq.setCharacterMaximumLength(q.getDataType().length());

        if (q.getDataType().hasPrecision())
            iq.setNumericPrecision(q.getDataType().precision());

        if (q.getDataType().hasScale())
            iq.setNumericScale(q.getDataType().scale());

        result.getSequences().add(iq);
    }

    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 static final void exportTable0(Configuration configuration, InformationSchema result, Table t, Set> includedTables) {
        org.jooq.util.xml.jaxb.Table it = new org.jooq.util.xml.jaxb.Table();

        if (!StringUtils.isBlank(t.getCatalog().getName()))
            it.setTableCatalog(t.getCatalog().getName());

        if (!StringUtils.isBlank(t.getSchema().getName()))
            it.setTableSchema(t.getSchema().getName());

        it.setTableName(t.getName());
        result.getTables().add(it);

        Field[] fields = t.fields();
        for (int i = 0; i < fields.length; i++) {
            Field f = fields[i];
            Column ic = new Column();

            if (!StringUtils.isBlank(t.getCatalog().getName()))
                ic.setTableCatalog(t.getCatalog().getName());

            if (!StringUtils.isBlank(t.getSchema().getName()))
                ic.setTableSchema(t.getSchema().getName());

            ic.setTableName(t.getName());
            ic.setColumnName(t.getName());
            ic.setDataType(f.getDataType().getTypeName(configuration));

            if (f.getDataType().hasLength())
                ic.setCharacterMaximumLength(f.getDataType().length());

            if (f.getDataType().hasPrecision())
                ic.setNumericPrecision(f.getDataType().precision());

            if (f.getDataType().hasScale())
                ic.setNumericScale(f.getDataType().scale());

            ic.setColumnDefault(DSL.using(configuration).render(f.getDataType().defaultValue()));
            ic.setIsNullable(f.getDataType().nullable());
            ic.setOrdinalPosition(i + 1);

            result.getColumns().add(ic);
        }

        for (UniqueKey key : t.getKeys())
            exportKey0(result, t, key, key.isPrimary() ? PRIMARY_KEY : UNIQUE);

        for (ForeignKey fk : t.getReferences())
            if (includedTables.contains(fk.getKey().getTable()))
                exportKey0(result, t, fk, FOREIGN_KEY);
    }

    private static final void exportKey0(InformationSchema result, Table t, Key key, TableConstraintType constraintType) {
        TableConstraint tc = new TableConstraint();

        String catalogName = t.getCatalog().getName();
        String schemaName = t.getSchema().getName();

        tc.setConstraintName(key.getName());
        tc.setConstraintType(constraintType);

        if (!StringUtils.isBlank(catalogName)) {
            tc.setConstraintCatalog(catalogName);
            tc.setTableCatalog(catalogName);
        }

        if (!StringUtils.isBlank(schemaName)) {
            tc.setConstraintSchema(schemaName);
            tc.setTableSchema(schemaName);
        }

        tc.setTableName(t.getName());
        result.getTableConstraints().add(tc);

        int i = 0;
        for (Field f : key.getFields()) {
            KeyColumnUsage kc = new KeyColumnUsage();

            if (!StringUtils.isBlank(catalogName)) {
                kc.setConstraintCatalog(catalogName);
                kc.setTableCatalog(catalogName);
            }

            if (!StringUtils.isBlank(schemaName)) {
                kc.setConstraintSchema(schemaName);
                kc.setTableSchema(schemaName);
            }

            kc.setColumnName(f.getName());
            kc.setTableName(t.getName());
            kc.setOrdinalPosition(++i);
            kc.setConstraintName(key.getName());

            result.getKeyColumnUsages().add(kc);
        }

        if (constraintType == FOREIGN_KEY) {
            ReferentialConstraint rc = new ReferentialConstraint();
            UniqueKey uk = ((ForeignKey) key).getKey();
            String ukCatalogName = uk.getTable().getCatalog().getName();
            String ukSchemaName = uk.getTable().getSchema().getName();

            if (!StringUtils.isBlank(catalogName))
                rc.setConstraintCatalog(catalogName);

            if (!StringUtils.isBlank(ukCatalogName))
                rc.setUniqueConstraintCatalog(ukCatalogName);

            if (!StringUtils.isBlank(schemaName))
                rc.setConstraintSchema(schemaName);

            if (!StringUtils.isBlank(ukSchemaName))
                rc.setUniqueConstraintSchema(ukSchemaName);

            rc.setConstraintName(key.getName());
            rc.setUniqueConstraintName(uk.getName());

            result.getReferentialConstraints().add(rc);
        }
    }

    private InformationSchemaExport() {}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy