in core/persistence-jpa-upgrader/src/main/java/org/apache/syncope/core/persistence/jpa/upgrade/WiserSchemaTool.java [53:224]
protected void buildSchema(
final SchemaGroup db,
final SchemaGroup repos,
final boolean considerDatabaseState) throws SQLException {
// add sequences
if (getSequences()) {
for (Schema schema : repos.getSchemas()) {
for (Sequence seq : schema.getSequences()) {
if (considerDatabaseState && db.findSequence(schema, seq.getQualifiedPath()) != null) {
continue;
}
if (createSequence(seq)) {
Schema dbSchema = Optional.ofNullable(db.getSchema(seq.getSchemaIdentifier())).
orElseGet(() -> db.addSchema(seq.getSchemaIdentifier()));
dbSchema.importSequence(seq);
} else {
_log.warn(_loc.get("add-seq", seq));
}
}
}
}
// order is important in this method; start with columns
DBIdentifier defaultSchemaName = DBIdentifier.newSchema(_dict.getDefaultSchemaName());
for (Schema schema : repos.getSchemas()) {
for (Table tab : schema.getTables()) {
Table dbTable = considerDatabaseState
? db.findTable(schema, tab.getQualifiedPath(), defaultSchemaName)
: null;
if (dbTable != null) {
for (Column col : tab.getColumns()) {
Column dbCol = dbTable.getColumn(col.getIdentifier());
if (dbCol == null) {
if (addColumn(col)) {
dbTable.importColumn(col);
} else {
_log.warn(_loc.get("add-col", col, tab));
}
} else if (!col.equalsColumn(_dict, dbCol)) {
_log.warn(_loc.get("bad-col",
new Object[] { dbCol, dbTable, dbCol.getDescription(), col.getDescription() }));
}
}
}
}
}
// primary keys
if (getPrimaryKeys()) {
for (Schema schema : repos.getSchemas()) {
for (Table tab : schema.getTables()) {
PrimaryKey pk = tab.getPrimaryKey();
Table dbTable = considerDatabaseState
? db.findTable(schema, tab.getQualifiedPath())
: null;
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 schema : repos.getSchemas()) {
for (Table tab : schema.getTables()) {
if (considerDatabaseState && db.findTable(schema, tab.getQualifiedPath()) != null) {
continue;
}
if (createTable(tab)) {
newTables.add(tab);
Schema dbSchema = Optional.ofNullable(db.getSchema(tab.getSchemaIdentifier())).
orElseGet(() -> db.addSchema(tab.getSchemaIdentifier()));
dbSchema.importTable(tab);
} else {
_log.warn(_loc.get("add-table", tab));
}
}
}
// indexes
for (Schema schema : repos.getSchemas()) {
Table[] tabs = schema.getTables();
for (Table tab : tabs) {
// create indexes on new tables even if indexes have been turned off
if (!getIndexes() && !newTables.contains(tab)) {
continue;
}
Table dbTable = considerDatabaseState
? db.findTable(schema, tab.getQualifiedPath())
: null;
if (dbTable != null) {
for (Index idx : tab.getIndexes()) {
Index dbIdx = findIndex(dbTable, idx);
if (dbIdx == null) {
if (createIndex(idx, dbTable, tab.getUniques())) {
dbTable.importIndex(idx);
} else {
_log.warn(_loc.get("add-index", idx, tab));
}
} else if (!idx.equalsIndex(dbIdx)) {
_log.warn(_loc.get("bad-index", dbIdx, dbTable));
}
}
}
}
}
// Unique Constraints on group of columns
for (Schema schema : repos.getSchemas()) {
for (Table tab : schema.getTables()) {
// create unique constraints only on new tables
if (!newTables.contains(tab)) {
continue;
}
Unique[] uniques = tab.getUniques();
if (uniques == null || uniques.length == 0) {
continue;
}
Table dbTable = considerDatabaseState
? db.findTable(tab)
: null;
if (dbTable == null) {
continue;
}
for (Unique unique : uniques) {
dbTable.importUnique(unique);
}
}
}
// foreign keys
for (Schema schema : repos.getSchemas()) {
for (Table tab : schema.getTables()) {
// create foreign keys on new tables even if fks have been turned off
if (!getForeignKeys() && !newTables.contains(tab)) {
continue;
}
Table dbTable = considerDatabaseState
? db.findTable(schema, tab.getQualifiedPath())
: null;
if (dbTable != null) {
for (ForeignKey fk : tab.getForeignKeys()) {
if (!fk.isLogical()) {
ForeignKey dbFk = findForeignKey(dbTable, fk);
if (dbFk == null) {
if (addForeignKey(fk)) {
dbTable.importForeignKey(fk);
} else {
_log.warn(_loc.get("add-fk", fk, tab));
}
} else if (!fk.equalsForeignKey(dbFk)) {
_log.warn(_loc.get("bad-fk", dbFk, dbTable));
}
}
}
}
}
}
}