protected void buildSchema()

in openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java [568:760]


    protected void buildSchema(SchemaGroup db, SchemaGroup repos, boolean considerDatabaseState) throws SQLException {
        // add sequences
        Schema[] schemas = repos.getSchemas();
        Schema schema;
        if (_seqs) {
            Sequence[] seqs;
            for (Schema value : schemas) {
                seqs = value.getSequences();
                for (Sequence seq : seqs) {
                    if (considerDatabaseState && db.findSequence(value, seq.getQualifiedPath()) != null) {
                        continue;
                    }

                    if (createSequence(seq)) {
                        schema = db.getSchema(seq.getSchemaIdentifier());
                        if (schema == null)
                            schema = db.addSchema(seq.getSchemaIdentifier());
                        schema.importSequence(seq);
                    }
                    else
                        _log.warn(_loc.get("add-seq", seq));
                }
            }
        }

        // order is important in this method; start with columns
        Table[] tabs;
        Table dbTable = null;
        Column[] cols;
        Column col;
        DBIdentifier defaultSchemaName = DBIdentifier.newSchema(_dict.getDefaultSchemaName());
        for (Schema schema2 : schemas) {
            tabs = schema2.getTables();
            for (Table tab : tabs) {
                cols = tab.getColumns();
                if (considerDatabaseState) {
                    dbTable = db.findTable(schema2, tab.getQualifiedPath(), defaultSchemaName);
                }
                for (Column column : cols) {
                    if (dbTable != null) {
                        DBIdentifier colName = column.getIdentifier();
                        col = dbTable.getColumn(colName);
                        if (col == null) {
                            if (addColumn(column))
                                dbTable.importColumn(column);
                            else
                                _log.warn(_loc.get("add-col", column,
                                        tab));
                        }
                        else if (!column.equalsColumn(_dict, col)) {
                            _log.warn(_loc.get("bad-col", new Object[]{
                                    col, dbTable, col.getDescription(),
                                    column.getDescription()}));
                        }
                    }
                }
            }
        }

        // primary keys
        if (_pks) {
            PrimaryKey pk;
            for (Schema value : schemas) {
                tabs = value.getTables();
                for (Table tab : tabs) {
                    pk = tab.getPrimaryKey();
                    if (considerDatabaseState) {
                        dbTable = db.findTable(value, tab.getQualifiedPath());
                    }
                    if (pk != null && !pk.isLogical() && dbTable != null) {
                        if (dbTable.getPrimaryKey() == null
                                && addPrimaryKey(pk))
                            dbTable.importPrimaryKey(pk);
                        else if (dbTable.getPrimaryKey() == null)
                            _log.warn(_loc.get("add-pk", pk, tab));
                        else if (!pk.equalsPrimaryKey(dbTable.getPrimaryKey()))
                            _log.warn(_loc.get("bad-pk",
                                    dbTable.getPrimaryKey(), dbTable));
                    }
                }
            }
        }

        // tables
        Set<Table> newTables = new HashSet<>();
        for (Schema schema1 : schemas) {
            tabs = schema1.getTables();
            for (Table tab : tabs) {
                if (considerDatabaseState && db.findTable(schema1, tab.getQualifiedPath()) != null) {
                    continue;
                }

                if (createTable(tab)) {
                    newTables.add(tab);
                    schema = db.getSchema(tab.getSchemaIdentifier());
                    if (schema == null)
                        schema = db.addSchema(tab.getSchemaIdentifier());
                    schema.importTable(tab);
                }
                else
                    _log.warn(_loc.get("add-table", tab));
            }
        }

        // indexes
        Index[] idxs;
        Index idx;
        for (Schema element : schemas) {
            tabs = element.getTables();
            for (Table tab : tabs) {
                // create indexes on new tables even if indexes
                // have been turned off
                if (!_indexes && !newTables.contains(tab))
                    continue;

                idxs = tab.getIndexes();
                if (considerDatabaseState) {
                    dbTable = db.findTable(element, tab.getQualifiedPath());
                }
                for (Index index : idxs) {
                    if (dbTable != null) {
                        idx = findIndex(dbTable, index);
                        if (idx == null) {
                            if (createIndex(index, dbTable, tab.getUniques()))
                                dbTable.importIndex(index);
                            else
                                _log.warn(_loc.get("add-index", index,
                                        tab));
                        }
                        else if (!index.equalsIndex(idx))
                            _log.warn(_loc.get("bad-index", idx, dbTable));
                    }
                }
            }
        }

        // Unique Constraints on group of columns
        Unique[] uniques;
        for (Schema item : schemas) {
            tabs = item.getTables();
            for (Table tab : tabs) {
                // create unique constraints only on new tables
                if (!newTables.contains(tab)) {
                    continue;
                }

                uniques = tab.getUniques();
                if (uniques == null || uniques.length == 0)
                    continue;
                if (considerDatabaseState) {
                    dbTable = db.findTable(tab);
                }
                if (dbTable == null)
                    continue;
                for (Unique unique : uniques) {
                    dbTable.importUnique(unique);
                }
            }
        }

        // foreign keys
        ForeignKey[] fks;
        ForeignKey fk;
        for (Schema value : schemas) {
            tabs = value.getTables();
            for (Table tab : tabs) {
                // create foreign keys on new tables even if fks
                // have been turned off
                if (!_fks && !newTables.contains(tab)) {
                    continue;
                }

                fks = tab.getForeignKeys();
                if (considerDatabaseState) {
                    dbTable = db.findTable(value, tab.getQualifiedPath());
                }
                for (ForeignKey foreignKey : fks) {
                    if (!foreignKey.isLogical() && dbTable != null) {
                        fk = findForeignKey(dbTable, foreignKey);
                        if (fk == null) {
                            if (addForeignKey(foreignKey))
                                dbTable.importForeignKey(foreignKey);
                            else
                                _log.warn(_loc.get("add-fk",
                                        foreignKey, tab));
                        }
                        else if (!foreignKey.equalsForeignKey(fk))
                            _log.warn(_loc.get("bad-fk", fk, dbTable));
                    }
                }
            }
        }
    }