From fa7d5124de7f1d0f49a77362e6c8f4ca17541c60 Mon Sep 17 00:00:00 2001 From: Nathan Voxland Date: Thu, 13 Jan 2022 08:50:06 -0600 Subject: [PATCH 1/3] EnterpriseDBDatabase shouldn't pick up database with just "edb" in the url --- .../database/core/EnterpriseDBDatabase.java | 2 +- .../core/EnterpriseDBDatabaseTest.groovy | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 liquibase-core/src/test/groovy/liquibase/database/core/EnterpriseDBDatabaseTest.groovy diff --git a/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java b/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java index 32dad4fc590..ecb252e1c96 100644 --- a/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java +++ b/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java @@ -10,7 +10,7 @@ public class EnterpriseDBDatabase extends PostgresDatabase { @Override public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException { final String url = conn.getURL(); - return url.contains("edb") || (url.contains("postgres") && url.contains(":5444")); + return url.contains(":edb:") || (url.contains(":postgres:") && url.contains(":5444")); } @Override diff --git a/liquibase-core/src/test/groovy/liquibase/database/core/EnterpriseDBDatabaseTest.groovy b/liquibase-core/src/test/groovy/liquibase/database/core/EnterpriseDBDatabaseTest.groovy new file mode 100644 index 00000000000..a8c5c9b95b5 --- /dev/null +++ b/liquibase-core/src/test/groovy/liquibase/database/core/EnterpriseDBDatabaseTest.groovy @@ -0,0 +1,33 @@ +package liquibase.database.core + +import liquibase.database.MockDatabaseConnection +import spock.lang.Specification +import spock.lang.Unroll + +class EnterpriseDBDatabaseTest extends Specification { + + @Unroll + def "isCorrectDatabaseImplementation"() { + when: + def returnUrl = url + + def conn = new MockDatabaseConnection() { + @Override + String getURL() { + return returnUrl + } + } + + + then: + assert new EnterpriseDBDatabase().isCorrectDatabaseImplementation(conn) == expected + + where: + url | expected + "jdbc:edb:localhost" | true + "jdbc:postgres:localhost:5444" | true + "jdbc:postgres:localhost:5432" | false + "jdbc:postgresql:localhost" | false + "jdbc:db2:localhost/thedb" | false + } +} From a91a8c73284254518cd0e4f0ef873da81a318aca Mon Sep 17 00:00:00 2001 From: Nathan Voxland Date: Wed, 19 Jan 2022 10:08:04 -0600 Subject: [PATCH 2/3] Determine if connection is EDB by calling version() --- .../database/core/EnterpriseDBDatabase.java | 24 +++++++++++++- .../core/EnterpriseDBDatabaseTest.groovy | 33 ------------------- 2 files changed, 23 insertions(+), 34 deletions(-) delete mode 100644 liquibase-core/src/test/groovy/liquibase/database/core/EnterpriseDBDatabaseTest.groovy diff --git a/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java b/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java index ecb252e1c96..944871fb766 100644 --- a/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java +++ b/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java @@ -1,16 +1,38 @@ package liquibase.database.core; import liquibase.database.DatabaseConnection; +import liquibase.database.jvm.JdbcConnection; import liquibase.exception.DatabaseException; import liquibase.statement.SqlStatement; import liquibase.statement.core.RawSqlStatement; +import liquibase.util.JdbcUtil; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; public class EnterpriseDBDatabase extends PostgresDatabase { @Override public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException { final String url = conn.getURL(); - return url.contains(":edb:") || (url.contains(":postgres:") && url.contains(":5444")); + if (url.startsWith("jdbc:edb:") || url.startsWith("jdbc:postgres")) { + if (conn instanceof JdbcConnection) { + try (Statement stmt = ((JdbcConnection) conn).createStatement()) { + if (stmt != null) { + try (ResultSet rs = stmt.executeQuery("select version()")) { + if (rs.next()) { + return ((String) JdbcUtil.getResultSetValue(rs, 1)).startsWith("EnterpriseDB"); + } + } + } + } catch (SQLException throwables) { + return false; + } + } + } + + return false; } @Override diff --git a/liquibase-core/src/test/groovy/liquibase/database/core/EnterpriseDBDatabaseTest.groovy b/liquibase-core/src/test/groovy/liquibase/database/core/EnterpriseDBDatabaseTest.groovy deleted file mode 100644 index a8c5c9b95b5..00000000000 --- a/liquibase-core/src/test/groovy/liquibase/database/core/EnterpriseDBDatabaseTest.groovy +++ /dev/null @@ -1,33 +0,0 @@ -package liquibase.database.core - -import liquibase.database.MockDatabaseConnection -import spock.lang.Specification -import spock.lang.Unroll - -class EnterpriseDBDatabaseTest extends Specification { - - @Unroll - def "isCorrectDatabaseImplementation"() { - when: - def returnUrl = url - - def conn = new MockDatabaseConnection() { - @Override - String getURL() { - return returnUrl - } - } - - - then: - assert new EnterpriseDBDatabase().isCorrectDatabaseImplementation(conn) == expected - - where: - url | expected - "jdbc:edb:localhost" | true - "jdbc:postgres:localhost:5444" | true - "jdbc:postgres:localhost:5432" | false - "jdbc:postgresql:localhost" | false - "jdbc:db2:localhost/thedb" | false - } -} From 548da8a2ef87dff6c5974baa419dcb03da8c3a79 Mon Sep 17 00:00:00 2001 From: Nathan Voxland Date: Wed, 19 Jan 2022 10:36:03 -0600 Subject: [PATCH 3/3] Determine if connection is EDB by calling version() --- .../java/liquibase/database/core/EnterpriseDBDatabase.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java b/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java index 944871fb766..604fa3fa44e 100644 --- a/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java +++ b/liquibase-core/src/main/java/liquibase/database/core/EnterpriseDBDatabase.java @@ -1,5 +1,6 @@ package liquibase.database.core; +import liquibase.Scope; import liquibase.database.DatabaseConnection; import liquibase.database.jvm.JdbcConnection; import liquibase.exception.DatabaseException; @@ -26,7 +27,8 @@ public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws D } } } - } catch (SQLException throwables) { + } catch (SQLException e) { + Scope.getCurrentScope().getLog(getClass()).fine("Error checking if connection is an EnterpriseDB database: "+e.getMessage(), e); return false; } }