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