You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2022/01/25 11:55:23 UTC

[empire-db] branch version3 updated: EMPIREDB-362 DBModelChecker fix

This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/version3 by this push:
     new e4d8bb7  EMPIREDB-362 DBModelChecker fix
e4d8bb7 is described below

commit e4d8bb703a3365914ab090cfa54c525371d033a3
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Tue Jan 25 12:55:21 2022 +0100

    EMPIREDB-362 DBModelChecker fix
---
 .../empire/samples/db/advanced/SampleAdvApp.java   |  2 +-
 .../org/apache/empire/samples/db/SampleApp.java    |  2 +-
 .../empire/db/validation/DBModelChecker.java       | 77 ++++++++++++----------
 .../org/apache/empire/dbms/DBMSHandlerBase.java    |  2 +-
 .../apache/empire/dbms/hsql/DBMSHandlerHSql.java   |  2 +-
 .../empire/dbms/oracle/OracleDBModelChecker.java   |  2 +-
 .../empire/dbms/sqlserver/MSSqlDBModelChecker.java |  2 +-
 7 files changed, 50 insertions(+), 39 deletions(-)

diff --git a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
index b3269f1..51b8208 100644
--- a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
+++ b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
@@ -332,7 +332,7 @@ public class SampleAdvApp
             log.info("Checking DataModel for {} using {}", db.getClass().getSimpleName(), modelChecker.getClass().getSimpleName());
             // dbo schema
             DBModelErrorLogger logger = new DBModelErrorLogger();
-            modelChecker.checkModel(context.getConnection(), logger);
+            modelChecker.checkModel(db, context.getConnection(), logger);
             // show result
             log.info("Data model check done. Found {} errors and {} warnings.", logger.getErrorCount(), logger.getWarnCount());
         } catch(Exception e) {
diff --git a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
index 3485308..2fc7d42 100644
--- a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
+++ b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
@@ -298,7 +298,7 @@ public class SampleApp
             log.info("Checking DataModel for {} using {}", db.getClass().getSimpleName(), modelChecker.getClass().getSimpleName());
             // dbo schema
             DBModelErrorLogger logger = new DBModelErrorLogger();
-            modelChecker.checkModel(context.getConnection(), logger);
+            modelChecker.checkModel(db, context.getConnection(), logger);
             // show result
             log.info("Data model check done. Found {} errors and {} warnings.", logger.getErrorCount(), logger.getWarnCount());
         } catch(Exception e) {
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 2b27dae..5f79538 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
@@ -42,8 +42,8 @@ import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.DBView;
 import org.apache.empire.exceptions.InternalException;
-import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.NotSupportedException;
+import org.apache.empire.exceptions.ObjectNotValidException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -81,7 +81,6 @@ public class DBModelChecker
         }
     }
 
-    protected final DBDatabase db; // the database to check
     protected final String catalog;
     protected final String schemaPattern;
 
@@ -95,9 +94,8 @@ public class DBModelChecker
      * @param catalog
      * @param schemaPattern
      */
-    public DBModelChecker(DBDatabase db, String catalog, String schemaPattern)
+    public DBModelChecker(String catalog, String schemaPattern)
     {
-        this.db = db;
         this.catalog = catalog;
         this.schemaPattern = schemaPattern;
         // set origin
@@ -116,7 +114,7 @@ public class DBModelChecker
 
     /**
      * Returns the RemoteDatabase
-     * Only available after checkModel() is called 
+     * Only available after parseModel() is called 
      * @return the remote Database
      */
     public DBDatabase getRemoteDatabase()
@@ -125,43 +123,41 @@ public class DBModelChecker
     }
     
     /**
-     * This method is used to check the database model
-     * 
-     * @param db
-     *            The Empire-db definition to be checked
-     * @param conn
-     *            A connection to the database
-     * @param dbSchema
-     *            The database schema
-     * @param handler
-     *            The {@link DBModelErrorHandler} implementation that is called whenever an error
-     *            occurs
+     * Populates the remote database and compares it against the given database
+     * @param db the Database to be checked
+     * @param conn the connection for retrieving the remote database metadata
+     * @param handler the handler that is called to handle inconsistencies
+     */
+    public void checkModel(DBDatabase db, Connection conn, DBModelErrorHandler handler)
+    {
+        // parse first
+        parseModel(conn);
+        // check database
+        checkRemoteAgainst(db, handler);
+    }
+    
+    /**
+     * This method is used to parse the populate the remote database
+     * @param conn the connection for retrieving the remote database metadata
      */
-    public synchronized void checkModel(Connection conn, DBModelErrorHandler handler)
+    public void parseModel(Connection conn)
     {
         try
-        {   // the chandler
-            if (handler==null && db!=null)
-                throw new InvalidArgumentException("handler", handler);
-            
-            // create remote db instance
-            remoteDb = new RemoteDatabase();
-            
+        {   // create remote db instance
+            remoteDb = createRemoteDatabase();
+            // populate
             DatabaseMetaData dbMeta = conn.getMetaData();
             populateRemoteDatabase(dbMeta);
-
-            // if db is null then populate only
-            if (db==null)
-                return;
-            
-            // now check the database
-            checkDatabase(handler);
         }
         catch (SQLException e)
         {
             log.error("checkModel failed for {}", remoteName);
             throw new InternalException(e);
-        } 
+        }
+        finally 
+        {   // cleanup
+            tableMap.clear();            
+        }
     }
 
     protected void populateRemoteDatabase(DatabaseMetaData dbMeta)
@@ -386,8 +382,18 @@ public class DBModelChecker
         }
     }
 
-    protected void checkDatabase(DBModelErrorHandler handler)
+    /**
+     * Check the remote database against an existing model
+     * @param db the database to check the remote against
+     * @param handler
+     */
+    public void checkRemoteAgainst(DBDatabase db, DBModelErrorHandler handler)
     {
+        if (this.remoteDb==null)
+        {   // parseModel has not been called
+            throw new ObjectNotValidException(this);
+        }
+        
         // check Tables
         for (DBTable table : db.getTables())
         {
@@ -724,6 +730,11 @@ public class DBModelChecker
     {
         return this.tableMap.get(tableName.toUpperCase());
     }
+
+    protected DBDatabase createRemoteDatabase()
+    {
+        return new RemoteDatabase();
+    }
     
     protected void addTable(String tableName)
     {
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
index 70f1ff5..79b5d2d 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
@@ -709,7 +709,7 @@ public abstract class DBMSHandlerBase implements DBMSHandler
     {
         log.warn("A general and possibly untested DBModelChecker is used for DBMSHandler {}. Please override to inklude DBMS specific features.", getClass().getSimpleName());
         // the default model checker
-        return new DBModelChecker(db, null, null);
+        return new DBModelChecker(null, null);
     }
     
     /**
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
index c2b1b87..a546432 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
@@ -302,7 +302,7 @@ public class DBMSHandlerHSql extends DBMSHandlerBase
     public DBModelChecker createModelChecker(DBDatabase db)
     {
         // the default model checker
-        return new DBModelChecker(db, "PUBLIC", "PUBLIC");
+        return new DBModelChecker("PUBLIC", "PUBLIC");
     }
     
 }
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDBModelChecker.java b/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDBModelChecker.java
index 902fd81..282bae6 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDBModelChecker.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDBModelChecker.java
@@ -44,7 +44,7 @@ public class OracleDBModelChecker extends DBModelChecker
     
     public OracleDBModelChecker(DBDatabase db, String schemaName)
     {
-        super(db, null, schemaName);
+        super(null, schemaName);
         // Detect boolean type
         DBMSHandler dbms = db.getDbms();
         if (dbms instanceof DBMSHandlerOracle)
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/MSSqlDBModelChecker.java b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/MSSqlDBModelChecker.java
index 916cb1e..aa858bc 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/MSSqlDBModelChecker.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/MSSqlDBModelChecker.java
@@ -39,7 +39,7 @@ public class MSSqlDBModelChecker extends DBModelChecker
      */
     public MSSqlDBModelChecker(DBDatabase db, String catalog, String schema)
     {
-        super(db, catalog, StringUtils.coalesce(schema, "DBO"));
+        super(catalog, StringUtils.coalesce(schema, "DBO"));
     }
 
     /**