in core/src/main/java/com/jetbrains/youtrackdb/internal/core/db/tool/DatabaseCompare.java [168:342]
private void compareSchema() {
Schema schema1 = sessionOne.getMetadata().getImmutableSchemaSnapshot();
Schema schema2 = sessionTwo.getMetadata().getImmutableSchemaSnapshot();
var ok = true;
for (var clazz : schema1.getClasses()) {
var clazz2 = schema2.getClass(clazz.getName());
if (clazz2 == null) {
listener.onMessage(
"\n- ERR: Class definition " + clazz.getName() + " for DB2 is null.");
continue;
}
final var sc1 = clazz.getSuperClassesNames();
final var sc2 = clazz2.getSuperClassesNames();
if (!sc1.isEmpty() || !sc2.isEmpty()) {
if (!new HashSet<>(sc1).containsAll(sc2) || !new HashSet<>(sc2).containsAll(sc1)) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " in DB1 is not equals in superclasses in DB2.");
ok = false;
}
}
if (!((SchemaClassInternal) clazz).getClassIndexes()
.equals(((SchemaClassInternal) clazz2).getClassIndexes())) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " in DB1 is not equals in indexes in DB2.");
ok = false;
}
if (!Arrays.equals(clazz.getCollectionIds(), clazz2.getCollectionIds())) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " in DB1 is not equals in collections in DB2.");
ok = false;
}
if (!clazz.getCustomKeys().equals(clazz2.getCustomKeys())) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " in DB1 is not equals in custom keys in DB2.");
ok = false;
}
for (var prop1 : clazz.getDeclaredProperties()) {
var prop2 = clazz2.getProperty(prop1.getName());
if (prop2 == null) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as missed property "
+ prop1.getName()
+ "in DB2.");
ok = false;
continue;
}
if (prop1.getType() != prop2.getType()) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same type for property "
+ prop1.getName()
+ "in DB2. ");
ok = false;
}
if (prop1.getLinkedType() != prop2.getLinkedType()) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same linkedtype for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
if (prop1.getMin() != null) {
if (!prop1.getMin().equals(prop2.getMin())) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same min for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
}
if (prop1.getMax() != null) {
if (!prop1.getMax().equals(prop2.getMax())) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same max for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
}
if (prop1.getMax() != null) {
if (!prop1.getMax().equals(prop2.getMax())) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same regexp for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
}
if (prop1.getLinkedClass() != null) {
if (!prop1.getLinkedClass().equals(prop2.getLinkedClass())) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same linked class for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
}
if (prop1.getLinkedClass() != null) {
if (!prop1.getCustomKeys().equals(prop2.getCustomKeys())) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same custom keys for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
}
if (prop1.isMandatory() != prop2.isMandatory()) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same mandatory flag for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
if (prop1.isNotNull() != prop2.isNotNull()) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same nut null flag for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
if (prop1.isReadonly() != prop2.isReadonly()) {
listener.onMessage(
"\n- ERR: Class definition for "
+ clazz.getName()
+ " as not same readonly flag setting for property "
+ prop1.getName()
+ "in DB2.");
ok = false;
}
}
if (!ok) {
++differences;
ok = true;
}
}
}