This is an automated email from the ASF dual-hosted git repository.
doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git
The following commit(s) were added to refs/heads/master by this push:
new 4b1caf04 EMPIREDB-401 Improved DBModelChecker and DBModelErrorLogger
4b1caf04 is described below
commit 4b1caf0435ffd9163a918bdf22e14b3fda1034c9
Author: Rainer Döbele <[email protected]>
AuthorDate: Thu Mar 2 13:01:45 2023 +0100
EMPIREDB-401
Improved DBModelChecker and DBModelErrorLogger
---
.../empire/db/validation/DBModelChecker.java | 30 +++++++----
.../empire/db/validation/DBModelErrorHandler.java | 11 ++++
.../empire/db/validation/DBModelErrorLogger.java | 63 ++++++++++++++++------
3 files changed, 79 insertions(+), 25 deletions(-)
diff --git
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
index b46ea2db..460ebf80 100644
---
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
+++
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
@@ -21,6 +21,7 @@ package org.apache.empire.db.validation;
import java.sql.Connection;
import java.util.List;
+import org.apache.empire.data.DataType;
import org.apache.empire.db.DBColumn;
import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBRelation;
@@ -171,19 +172,27 @@ public class DBModelChecker
DBColumn[] pk = table.getPrimaryKey().getColumns();
DBColumn[] remotePk = remoteTable.getPrimaryKey().getColumns();
+ int pkColIdx = -1;
+ boolean hasOrderMismatch = false;
pkColLoop: for (DBColumn pkCol : pk)
{
+ pkColIdx++;
+ int remColIdx = -1;
for (DBColumn remotePkCol : remotePk)
{
- if
(pkCol.getFullName().equalsIgnoreCase(remotePkCol.getFullName()))
- {
- // found
+ remColIdx++;
+ if (pkCol.getName().equalsIgnoreCase(remotePkCol.getName()))
+ { // found
+ hasOrderMismatch |= (pkColIdx!=remColIdx);
continue pkColLoop;
}
}
// PK-Column not found
handler.primaryKeyColumnMissing(table.getPrimaryKey(), pkCol);
}
+ // order mismatch?
+ if (hasOrderMismatch || (remotePk.length>pk.length))
+ handler.primaryKeyMismatch(table.getPrimaryKey(), remotePk);
}
protected void checkForeignKeys(DBTable table, DBTable remoteTable,
DBModelErrorHandler handler)
@@ -206,11 +215,8 @@ public class DBModelChecker
DBTable targetTable = (DBTable)
reference.getTargetColumn().getRowSet();
DBTableColumn targetColumn = reference.getTargetColumn();
if (!targetTable.getPrimaryKey().contains(targetColumn))
- {
- DBModelChecker.log.info("The column "
- +
targetColumn.getName()
- + " of foreign key {}
is not a primary key of table {} and cant be checked because of a limitation in
JDBC",
- relation.getName(),
targetTable.getName());
+ { // Target column is not the primary key of target table
+ log.info("The column {} of foreign key {} is not a
primary key of table {}", targetColumn.getName(), relation.getName(),
targetTable.getName());
continue;
}
}
@@ -219,8 +225,8 @@ public class DBModelChecker
{
for (DBReference remoteReference :
remoteRelation.getReferences())
{
- if
(reference.getSourceColumn().getFullName().equalsIgnoreCase(remoteReference.getSourceColumn().getFullName())
- &&
reference.getTargetColumn().getFullName().equalsIgnoreCase(remoteReference.getTargetColumn().getFullName()))
+ if
(reference.getSourceColumn().toString().equalsIgnoreCase(remoteReference.getSourceColumn().toString())
+ &&
reference.getTargetColumn().toString().equalsIgnoreCase(remoteReference.getTargetColumn().toString()))
{
// found
continue referenceLoop;
@@ -316,6 +322,10 @@ public class DBModelChecker
{ // When size is 0, don't check
return;
}
+ if (column.getDataType()==DataType.AUTOINC)
+ { // Don't check AutoInc
+ return;
+ }
if (colSize != (int) remoteColumn.getSize())
{
handler.columnSizeMismatch(column, (int) remoteColumn.getSize(),
0);
diff --git
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorHandler.java
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorHandler.java
index e7942a0a..a49f75fd 100644
---
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorHandler.java
+++
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorHandler.java
@@ -54,6 +54,17 @@ public interface DBModelErrorHandler
*/
void primaryKeyColumnMissing(DBIndex primaryKey, DBColumn column);
+ /**
+ * This method is called when the primary key of the Empire-db definition
+ * does not match the primary key of the existing table
+ *
+ * @param primaryKey
+ * The primary key as defined in the model
+ * @param column
+ * The primary key of the existing table
+ */
+ void primaryKeyMismatch(DBIndex primaryKey, DBColumn[] tableKey);
+
/**
* This method is called when the type of a column in the Empire-db
* definition does not match the database.
diff --git
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorLogger.java
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorLogger.java
index e77d17fa..bc989a52 100644
---
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorLogger.java
+++
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorLogger.java
@@ -49,6 +49,16 @@ public class DBModelErrorLogger implements
DBModelErrorHandler
{
return warnCount;
}
+
+ protected void logWarn(String msg, Object...params)
+ {
+ DBModelErrorLogger.log.warn(msg, params);
+ }
+
+ protected void logError(String msg, Object...params)
+ {
+ DBModelErrorLogger.log.error(msg, params);
+ }
/**
* handle itemNotFound errors
@@ -59,31 +69,31 @@ public class DBModelErrorLogger implements
DBModelErrorHandler
if (dbo instanceof DBTable)
{
DBTable table = (DBTable)dbo;
- DBModelErrorLogger.log.error("The table {} does not exist in the
target database.", table.getName());
+ logError("The table {} does not exist in the target database.",
table.getName());
}
else if (dbo instanceof DBColumn)
{
DBColumn column = (DBColumn) dbo;
- DBModelErrorLogger.log.error("The column {} does not exist in the
target database.", column.getFullName());
+ logError("The column {} does not exist in the target database.",
column.getFullName());
}
else if (dbo instanceof DBIndex)
{
DBIndex dbi = (DBIndex) dbo;
- DBModelErrorLogger.log.error("The primary key {} for table{} does
not exist in the target database.", dbi.getName(), dbi.getTable().getName());
+ logError("The primary key {} for table{} does not exist in the
target database.", dbi.getName(), dbi.getTable().getName());
}
else if (dbo instanceof DBView)
{
DBView view = (DBView)dbo;
- DBModelErrorLogger.log.error("The view {} does not exist in the
target database.", view.getName());
+ logError("The view {} does not exist in the target database.",
view.getName());
}
else if (dbo instanceof DBRelation)
{
DBRelation relation = (DBRelation)dbo;
- DBModelErrorLogger.log.error("The foreing key relation
"+relation.getName()+" from table {} to table {} does not exist in the target
database.", relation.getForeignKeyTable().getName(),
relation.getReferencedTable().getName());
+ logError("The foreing key relation "+relation.getName()+" from
table {} to table {} does not exist in the target database.",
relation.getForeignKeyTable().getName(),
relation.getReferencedTable().getName());
}
else
{
- DBModelErrorLogger.log.error("The object {} does not exist in the
target database.", dbo.toString());
+ logError("The object {} does not exist in the target database.",
dbo.toString());
}
// increase count
errorCount++;
@@ -96,7 +106,7 @@ public class DBModelErrorLogger implements
DBModelErrorHandler
public void objectTypeMismatch(DBObject object, String name, Class<?>
expectedType)
{
// log
- DBModelErrorLogger.log.error("The oboject \"{}\" type of {} does not
match the expected type of {}.", name, object.getClass().getSimpleName(),
expectedType.getSimpleName());
+ logError("The oboject \"{}\" type of {} does not match the expected
type of {}.", name, object.getClass().getSimpleName(),
expectedType.getSimpleName());
// increase count
errorCount++;
}
@@ -112,7 +122,7 @@ public class DBModelErrorLogger implements
DBModelErrorHandler
return;
}
// log
- DBModelErrorLogger.log.error("The column " + col.getFullName() + "
type of {} does not match the database type of {}.", col.getDataType(), type);
+ logError("The column " + col.getFullName() + " type of {} does not
match the database type of {}.", col.getDataType(), type);
// increase count
errorCount++;
}
@@ -125,13 +135,13 @@ public class DBModelErrorLogger implements
DBModelErrorHandler
{
if (size>0 && size<col.getSize())
{ // Database size is smaller: Error
- DBModelErrorLogger.log.error("The column "+col.getFullName()+"
size of {} does not match the database size of {}.", col.getSize(), size);
+ logError("The column "+col.getFullName()+" size of {} does not
match the database size of {}.", col.getSize(), size);
// increase count
errorCount++;
- }
+ }
else if (col.getDataType()!=DataType.INTEGER)
{ // Database size is bigger or unknown: Warning only
- DBModelErrorLogger.log.warn("The column "+col.getFullName()+" size
of {} does not match the database size of {}.", col.getSize(), size);
+ logWarn("The column "+col.getFullName()+" size of {} does not
match the database size of {}.", col.getSize(), size);
// increase count
warnCount++;
}
@@ -145,11 +155,11 @@ public class DBModelErrorLogger implements
DBModelErrorHandler
{
if (nullable)
{
- DBModelErrorLogger.log.error("The column " + col.getFullName() + "
must not be nullable");
+ logError("The column " + col.getFullName() + " must not be
nullable");
}
else
{
- DBModelErrorLogger.log.error("The column " + col.getFullName() + "
must be nullable");
+ logError("The column " + col.getFullName() + " must be nullable");
}
// increase count
errorCount++;
@@ -161,10 +171,33 @@ public class DBModelErrorLogger implements
DBModelErrorHandler
@Override
public void primaryKeyColumnMissing(DBIndex primaryKey, DBColumn column)
{
- DBModelErrorLogger.log.error("The primary key " + primaryKey.getName()
+ " of table " + primaryKey.getTable().getName()
- + " misses the column " +
column.getName());
+ logError("The primary key of table {} misses the column {}",
primaryKey.getTable().getName(), column.getName());
// increase count
errorCount++;
}
+ @Override
+ public void primaryKeyMismatch(DBIndex primaryKey, DBColumn[] tableKey)
+ {
+ String defColumns;
+ String tblColumns;
+ StringBuilder b = new StringBuilder("[");
+ DBColumn[] keyColumns = primaryKey.getColumns();
+ for (int i=0; i<keyColumns.length; i++) {
+ if (i>0) b.append("|");
+ b.append(keyColumns[i].getName());
+ }
+ b.append("]");
+ defColumns = b.toString();
+ b.setLength(1);
+ for (int i=0; i<tableKey.length; i++) {
+ if (i>0) b.append("|");
+ b.append(tableKey[i].getName());
+ }
+ b.append("]");
+ tblColumns = b.toString();
+ logError("The primary key of table {} {} does not match the key of the
existing table {}.", primaryKey.getTable().getName(), defColumns, tblColumns);
+ // increase count
+ warnCount++;
+ }
}