package io.cattle.platform.liquibase; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.datasource.DataSourceFactory; import java.util.EnumSet; import java.util.Set; import javax.inject.Inject; import liquibase.exception.LiquibaseException; import liquibase.integration.spring.SpringLiquibase; import org.jooq.Configuration; import org.jooq.SQLDialect; import org.jooq.impl.DSL; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netflix.config.DynamicStringProperty; public class Loader extends SpringLiquibase { private static final Set<SQLDialect> EMBEDDED = EnumSet.of(SQLDialect.H2, SQLDialect.HSQLDB, SQLDialect.DERBY); private static final String LOG_OPTION = "liquibase.databaseChangeLogTableName"; private static final String LOCK_OPTION = "liquibase.databaseChangeLogLockTableName"; private static final DynamicStringProperty RELEASE_LOCK = ArchaiusUtil.getString("db.release.change.lock"); private static final Logger log = LoggerFactory.getLogger("ConsoleStatus"); Configuration configuration; String lockTable = "DATABASECHANGELOGLOCK"; String changeLogTable = "DATABASECHANGELOG"; DataSourceFactory dataSourceFactory; @Override public void afterPropertiesSet() throws LiquibaseException { if (getDataSource() == null && dataSourceFactory != null) { setDataSource(dataSourceFactory.createDataSource("liquibase")); } String oldLockTable = System.getProperty(LOCK_OPTION); String oldLogTable = System.getProperty(LOG_OPTION); try { try { System.setProperty(LOG_OPTION, changeLogTable); System.setProperty(LOCK_OPTION, lockTable); boolean release = false; if ("true".equals(RELEASE_LOCK.get())) { release = true; } else if ("false".equals(RELEASE_LOCK.get())) { release = false; } else { release = EMBEDDED.contains(configuration.dialect()); } if (release) { DSL.using(getConfiguration()).delete(DSL.table(lockTable)).execute(); } } catch (Throwable t) { // ignore errors } log.info("Starting DB migration"); super.afterPropertiesSet(); log.info("DB migration done"); } finally { if (oldLogTable == null) { System.clearProperty(LOG_OPTION); } else { System.setProperty(LOG_OPTION, oldLogTable); } if (oldLockTable == null) { System.clearProperty(LOCK_OPTION); } else { System.setProperty(LOCK_OPTION, oldLockTable); } } } @Inject public void setConfiguration(Configuration configuration) { this.configuration = configuration; } public Configuration getConfiguration() { return configuration; } public String getLockTable() { return lockTable; } public void setLockTable(String lockTable) { this.lockTable = lockTable; } public String getChangeLogTable() { return changeLogTable; } public void setChangeLogTable(String changeLogTable) { this.changeLogTable = changeLogTable; } public DataSourceFactory getDataSourceFactory() { return dataSourceFactory; } public void setDataSourceFactory(DataSourceFactory dataSourceFactory) { this.dataSourceFactory = dataSourceFactory; } }