package liquibase.diff.compare.core; import liquibase.CatalogAndSchema; import liquibase.database.Database; import liquibase.diff.ObjectDifferences; import liquibase.diff.compare.CompareControl; import liquibase.diff.compare.DatabaseObjectComparator; import liquibase.diff.compare.DatabaseObjectComparatorChain; import liquibase.structure.DatabaseObject; import liquibase.structure.core.Catalog; import liquibase.structure.core.Schema; import liquibase.util.StringUtils; import java.util.Set; public class CatalogComparator implements DatabaseObjectComparator { @Override public int getPriority(Class<? extends DatabaseObject> objectType, Database database) { if (Catalog.class.isAssignableFrom(objectType)) { return PRIORITY_TYPE; } return PRIORITY_NONE; } @Override public String[] hash(DatabaseObject databaseObject, Database accordingTo, DatabaseObjectComparatorChain chain) { return null; } @Override public boolean isSameObject(DatabaseObject databaseObject1, DatabaseObject databaseObject2, Database accordingTo, DatabaseObjectComparatorChain chain) { if (!(databaseObject1 instanceof Catalog && databaseObject2 instanceof Catalog)) { return false; } if (!accordingTo.supportsCatalogs()) { return true; } String object1Name; if (((Catalog) databaseObject1).isDefault()) { object1Name = null; } else { object1Name = databaseObject1.getName(); } String object2Name; if (((Catalog) databaseObject2).isDefault()) { object2Name = null; } else { object2Name = databaseObject2.getName(); } CatalogAndSchema thisSchema = new CatalogAndSchema(object1Name, null).standardize(accordingTo); CatalogAndSchema otherSchema = new CatalogAndSchema(object2Name, null).standardize(accordingTo); if (thisSchema.getCatalogName() == null) { return otherSchema.getCatalogName() == null; } if (thisSchema.getCatalogName().equalsIgnoreCase(otherSchema.getCatalogName())) { return true; } if (accordingTo.supportsSchemas()) { //no need to check schema mappings return false; } //check with schemaComparisons if (chain.getSchemaComparisons() != null && chain.getSchemaComparisons().length > 0) { for (CompareControl.SchemaComparison comparison : chain.getSchemaComparisons()) { String comparisonCatalog1; String comparisonCatalog2; if (accordingTo.supportsSchemas()) { comparisonCatalog1 = comparison.getComparisonSchema().getSchemaName(); comparisonCatalog2 = comparison.getReferenceSchema().getSchemaName(); } else if (accordingTo.supportsCatalogs()) { comparisonCatalog1 = comparison.getComparisonSchema().getCatalogName(); comparisonCatalog2 = comparison.getReferenceSchema().getCatalogName(); } else { break; } String finalCatalog1 = thisSchema.getCatalogName(); String finalCatalog2 = otherSchema.getCatalogName(); if (comparisonCatalog1 != null && comparisonCatalog1.equalsIgnoreCase(finalCatalog1)) { finalCatalog1 = comparisonCatalog2; } else if (comparisonCatalog2 != null && comparisonCatalog2.equalsIgnoreCase(finalCatalog1)) { finalCatalog1 = comparisonCatalog1; } if (StringUtils.trimToEmpty(finalCatalog1).equalsIgnoreCase(StringUtils.trimToEmpty(finalCatalog2))) { return true; } if (comparisonCatalog1 != null && comparisonCatalog1.equalsIgnoreCase(finalCatalog2)) { finalCatalog2 = comparisonCatalog2; } else if (comparisonCatalog2 != null && comparisonCatalog2.equalsIgnoreCase(finalCatalog2)) { finalCatalog2 = comparisonCatalog1; } if (StringUtils.trimToEmpty(finalCatalog1).equalsIgnoreCase(StringUtils.trimToEmpty(finalCatalog2))) { return true; } } } return false; } @Override public ObjectDifferences findDifferences(DatabaseObject databaseObject1, DatabaseObject databaseObject2, Database accordingTo, CompareControl compareControl, DatabaseObjectComparatorChain chain, Set<String> exclude) { ObjectDifferences differences = new ObjectDifferences(compareControl); differences.compare("name", databaseObject1, databaseObject2, new ObjectDifferences.DatabaseObjectNameCompareFunction(Schema.class, accordingTo)); return differences; } }