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

Reply via email to