diff --git a/src/main/java/liquibase/ext/cassandra/changelog/CassandraChangeLogHistoryService.java b/src/main/java/liquibase/ext/cassandra/changelog/CassandraChangeLogHistoryService.java index ee384358..aa55b382 100644 --- a/src/main/java/liquibase/ext/cassandra/changelog/CassandraChangeLogHistoryService.java +++ b/src/main/java/liquibase/ext/cassandra/changelog/CassandraChangeLogHistoryService.java @@ -1,13 +1,5 @@ package liquibase.ext.cassandra.changelog; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Map; - import liquibase.Scope; import liquibase.changelog.StandardChangeLogHistoryService; import liquibase.database.Database; @@ -16,6 +8,14 @@ import liquibase.ext.cassandra.database.CassandraDatabase; import liquibase.statement.core.RawSqlStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Map; + public class CassandraChangeLogHistoryService extends StandardChangeLogHistoryService { @Override @@ -30,7 +30,22 @@ public boolean supports(Database database) { @Override public boolean hasDatabaseChangeLogTable() { - return ((CassandraDatabase)getDatabase()).hasDatabaseChangeLogLockTable(); + boolean hasChangeLogTable; + try { + Statement statement = ((CassandraDatabase) getDatabase()).getStatement(); + statement.executeQuery("select ID from " + getChangeLogTableName()); + statement.close(); + hasChangeLogTable = true; + } catch (SQLException e) { + Scope.getCurrentScope().getLog(getClass()).info("No " + getChangeLogTableName() + " available in cassandra."); + hasChangeLogTable = false; + } catch (DatabaseException e) { + e.printStackTrace(); + hasChangeLogTable = false; + } + + // needs to be generated up front + return hasChangeLogTable; } @@ -39,8 +54,7 @@ public int getNextSequenceValue() { int next = 0; try { Statement statement = ((CassandraDatabase) getDatabase()).getStatement(); - ResultSet rs = statement.executeQuery("SELECT ID, AUTHOR, ORDEREXECUTED FROM " + - getDatabase().getDefaultCatalogName() + ".DATABASECHANGELOG"); + ResultSet rs = statement.executeQuery("SELECT ID, AUTHOR, ORDEREXECUTED FROM " + getChangeLogTableName()); while (rs.next()) { int order = rs.getInt("ORDEREXECUTED"); next = Math.max(order, next); @@ -55,11 +69,17 @@ public int getNextSequenceValue() { @Override public List> queryDatabaseChangeLogTable(Database database) throws DatabaseException { - RawSqlStatement select = new RawSqlStatement("SELECT * FROM " + database.getDefaultCatalogName() + - ".DATABASECHANGELOG"); + RawSqlStatement select = new RawSqlStatement("SELECT * FROM " + getChangeLogTableName()); final List> returnList = Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", database).queryForList(select); returnList.sort(Comparator.comparing((Map o) -> (Date) o.get("DATEEXECUTED")).thenComparingInt(o -> (Integer) o.get("ORDEREXECUTED"))); return returnList; } + private String getChangeLogTableName() { + if (getDatabase().getLiquibaseCatalogName() != null) { + return getDatabase().getLiquibaseCatalogName() + "." + getDatabase().getDatabaseChangeLogTableName(); + } else { + return getDatabase().getDatabaseChangeLogTableName(); + } + } } diff --git a/src/main/java/liquibase/ext/cassandra/database/CassandraDatabase.java b/src/main/java/liquibase/ext/cassandra/database/CassandraDatabase.java index af5e195b..068c15ca 100644 --- a/src/main/java/liquibase/ext/cassandra/database/CassandraDatabase.java +++ b/src/main/java/liquibase/ext/cassandra/database/CassandraDatabase.java @@ -135,25 +135,6 @@ public Statement getStatement() throws DatabaseException { return ((JdbcConnection) super.getConnection()).createStatement(); } - public boolean hasDatabaseChangeLogLockTable() { - boolean hasChangeLogLockTable; - try { - Statement statement = getStatement(); - statement.executeQuery("SELECT ID from " + getDefaultCatalogName() + ".DATABASECHANGELOGLOCK"); - statement.close(); - hasChangeLogLockTable = true; - } catch (SQLException e) { - Scope.getCurrentScope().getLog(getClass()).info("No DATABASECHANGELOGLOCK available in cassandra."); - hasChangeLogLockTable = false; - } catch (DatabaseException e) { - e.printStackTrace(); - hasChangeLogLockTable = false; - } - - // needs to be generated up front - return hasChangeLogLockTable; - } - @Override public boolean jdbcCallsCatalogsSchemas() { return true; diff --git a/src/main/java/liquibase/ext/cassandra/lockservice/LockServiceCassandra.java b/src/main/java/liquibase/ext/cassandra/lockservice/LockServiceCassandra.java index 9953fb34..51b69359 100644 --- a/src/main/java/liquibase/ext/cassandra/lockservice/LockServiceCassandra.java +++ b/src/main/java/liquibase/ext/cassandra/lockservice/LockServiceCassandra.java @@ -12,7 +12,6 @@ import liquibase.executor.ExecutorService; import liquibase.ext.cassandra.database.CassandraDatabase; import liquibase.lockservice.StandardLockService; -import liquibase.logging.LogFactory; import liquibase.sql.Sql; import liquibase.sqlgenerator.SqlGeneratorFactory; import liquibase.statement.core.LockDatabaseChangeLogStatement; @@ -53,7 +52,7 @@ public boolean acquireLock() throws LockException { boolean locked = executor.queryForInt( - new RawSqlStatement("SELECT COUNT(*) FROM " + database.getDefaultCatalogName() + ".DATABASECHANGELOGLOCK where " + + new RawSqlStatement("SELECT COUNT(*) FROM " + getChangeLogLockTableName() + " where " + "locked = TRUE ALLOW FILTERING") ) > 0; @@ -140,7 +139,22 @@ public void releaseLock() throws LockException { @Override public boolean hasDatabaseChangeLogLockTable() { - return ((CassandraDatabase)database).hasDatabaseChangeLogLockTable(); + boolean hasChangeLogLockTable; + try { + Statement statement = ((CassandraDatabase) database).getStatement(); + statement.executeQuery("SELECT ID from " + getChangeLogLockTableName()); + statement.close(); + hasChangeLogLockTable = true; + } catch (SQLException e) { + Scope.getCurrentScope().getLog(getClass()).info("No " + getChangeLogLockTableName() + " available in cassandra."); + hasChangeLogLockTable = false; + } catch (DatabaseException e) { + e.printStackTrace(); + hasChangeLogLockTable = false; + } + + // needs to be generated up front + return hasChangeLogLockTable; } @Override @@ -150,7 +164,7 @@ public boolean isDatabaseChangeLogLockTableInitialized(final boolean tableJustCr try { isDatabaseChangeLogLockTableInitialized = executor.queryForInt( - new RawSqlStatement("SELECT COUNT(*) FROM " + database.getDefaultCatalogName() + ".DATABASECHANGELOGLOCK") + new RawSqlStatement("SELECT COUNT(*) FROM " + getChangeLogLockTableName()) ) > 0; } catch (LiquibaseException e) { if (executor.updatesDatabase()) { @@ -164,4 +178,11 @@ public boolean isDatabaseChangeLogLockTableInitialized(final boolean tableJustCr return isDatabaseChangeLogLockTableInitialized; } + private String getChangeLogLockTableName() { + if(database.getLiquibaseCatalogName() != null) { + return database.getLiquibaseCatalogName() + "." + database.getDatabaseChangeLogLockTableName(); + } else { + return database.getDatabaseChangeLogLockTableName(); + } + } } diff --git a/src/main/java/liquibase/ext/cassandra/sqlgenerator/CreateDatabaseChangeLogLockTableGeneratorCassandra.java b/src/main/java/liquibase/ext/cassandra/sqlgenerator/CreateDatabaseChangeLogLockTableGeneratorCassandra.java index 08ab201d..13ce333c 100644 --- a/src/main/java/liquibase/ext/cassandra/sqlgenerator/CreateDatabaseChangeLogLockTableGeneratorCassandra.java +++ b/src/main/java/liquibase/ext/cassandra/sqlgenerator/CreateDatabaseChangeLogLockTableGeneratorCassandra.java @@ -25,7 +25,7 @@ public boolean supports(CreateDatabaseChangeLogLockTableStatement statement, Dat public Sql[] generateSql(CreateDatabaseChangeLogLockTableStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { RawSqlStatement createTableStatement = new RawSqlStatement("CREATE TABLE IF NOT EXISTS " + - database.escapeTableName(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), "databasechangeloglock") + + database.escapeTableName(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), database.getDatabaseChangeLogLockTableName()) + " (ID INT, LOCKED BOOLEAN, LOCKGRANTED timestamp, LOCKEDBY TEXT, PRIMARY KEY (ID))"); return SqlGeneratorFactory.getInstance().generateSql(createTableStatement, database); diff --git a/src/main/java/liquibase/ext/cassandra/sqlgenerator/CreateDatabaseChangeLogTableGeneratorCassandra.java b/src/main/java/liquibase/ext/cassandra/sqlgenerator/CreateDatabaseChangeLogTableGeneratorCassandra.java index c22ba32d..4f82a805 100644 --- a/src/main/java/liquibase/ext/cassandra/sqlgenerator/CreateDatabaseChangeLogTableGeneratorCassandra.java +++ b/src/main/java/liquibase/ext/cassandra/sqlgenerator/CreateDatabaseChangeLogTableGeneratorCassandra.java @@ -36,7 +36,7 @@ public Sql[] generateSql(CreateDatabaseChangeLogTableStatement statement, Databa RawSqlStatement createTableStatement = new RawSqlStatement("CREATE TABLE IF NOT EXISTS " + - database.escapeTableName(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), "databasechangelog") + + database.escapeTableName(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), database.getDatabaseChangeLogTableName()) + "( ID TEXT, AUTHOR TEXT, FILENAME TEXT, DATEEXECUTED timestamp, ORDEREXECUTED INT, EXECTYPE TEXT, MD5SUM TEXT, DESCRIPTION TEXT, COMMENTS TEXT, TAG TEXT, LIQUIBASE TEXT, CONTEXTS TEXT, LABELS TEXT, DEPLOYMENT_ID TEXT,PRIMARY KEY (ID, AUTHOR, FILENAME))"); return SqlGeneratorFactory.getInstance().generateSql(createTableStatement, database); diff --git a/src/main/java/liquibase/ext/cassandra/sqlgenerator/InitializeDatabaseChangeLogLockTableGeneratorCassandra.java b/src/main/java/liquibase/ext/cassandra/sqlgenerator/InitializeDatabaseChangeLogLockTableGeneratorCassandra.java index df9301d8..67651acb 100644 --- a/src/main/java/liquibase/ext/cassandra/sqlgenerator/InitializeDatabaseChangeLogLockTableGeneratorCassandra.java +++ b/src/main/java/liquibase/ext/cassandra/sqlgenerator/InitializeDatabaseChangeLogLockTableGeneratorCassandra.java @@ -27,7 +27,7 @@ public Sql[] generateSql(InitializeDatabaseChangeLogLockTableStatement statement RawSqlStatement deleteStatement = new RawSqlStatement("TRUNCATE TABLE " + database.escapeTableName( database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), - "databasechangeloglock".toUpperCase())); + database.getDatabaseChangeLogLockTableName().toUpperCase())); return SqlGeneratorFactory.getInstance().generateSql(deleteStatement, database); diff --git a/src/main/java/liquibase/ext/cassandra/sqlgenerator/LockDatabaseChangeLogGeneratorCassandra.java b/src/main/java/liquibase/ext/cassandra/sqlgenerator/LockDatabaseChangeLogGeneratorCassandra.java index e7d7d5a8..5c4859f2 100644 --- a/src/main/java/liquibase/ext/cassandra/sqlgenerator/LockDatabaseChangeLogGeneratorCassandra.java +++ b/src/main/java/liquibase/ext/cassandra/sqlgenerator/LockDatabaseChangeLogGeneratorCassandra.java @@ -24,7 +24,7 @@ public boolean supports(LockDatabaseChangeLogStatement statement, Database datab @Override public Sql[] generateSql(LockDatabaseChangeLogStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { RawSqlStatement updateStatement = new RawSqlStatement("UPDATE " + - database.escapeTableName(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), "databasechangeloglock") + + database.escapeTableName(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), database.getDatabaseChangeLogLockTableName()) + " SET LOCKED = TRUE, LOCKEDBY = '" + hostname + " (" + hostaddress + ")" + "', LOCKGRANTED = " + System.currentTimeMillis() + " WHERE ID = 1"); return SqlGeneratorFactory.getInstance().generateSql(updateStatement, database); }