You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.7 KiB
69 lines
2.7 KiB
package org.airsonic.player.spring;
|
|
|
|
import liquibase.database.Database;
|
|
import liquibase.database.DatabaseConnection;
|
|
import liquibase.database.DatabaseFactory;
|
|
import liquibase.database.OfflineConnection;
|
|
import liquibase.database.jvm.JdbcConnection;
|
|
import liquibase.exception.DatabaseException;
|
|
import liquibase.exception.LiquibaseException;
|
|
import liquibase.resource.ResourceAccessor;
|
|
import liquibase.util.StringUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import java.sql.Connection;
|
|
import java.util.List;
|
|
|
|
public class SpringLiquibase extends liquibase.integration.spring.SpringLiquibase {
|
|
private static final Logger LOG = LoggerFactory.getLogger(SpringLiquibase.class);
|
|
|
|
@Override
|
|
public void afterPropertiesSet() throws LiquibaseException {
|
|
LOG.trace("Starting Liquibase Update");
|
|
try {
|
|
super.afterPropertiesSet();
|
|
} catch (Exception e) {
|
|
LOG.error("===============================================");
|
|
LOG.error("An exception occurred during database migration");
|
|
LOG.error("A rollback file has been generated at " + rollbackFile);
|
|
LOG.error("Execute it within your database to rollback any changes");
|
|
LOG.error("The exception is as follows\n", e);
|
|
LOG.error("===============================================");
|
|
throw(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected Database createDatabase(
|
|
Connection c, ResourceAccessor resourceAccessor
|
|
) throws DatabaseException {
|
|
DatabaseConnection liquibaseConnection;
|
|
if (c == null) {
|
|
log.warning("Null connection returned by liquibase datasource. Using offline unknown database");
|
|
liquibaseConnection = new OfflineConnection("offline:unknown", resourceAccessor);
|
|
|
|
} else {
|
|
liquibaseConnection = new JdbcConnection(c);
|
|
}
|
|
DatabaseFactory factory = DatabaseFactory.getInstance();
|
|
overrideHsqlDbImplementation(factory);
|
|
Database database = factory.findCorrectDatabaseImplementation(liquibaseConnection);
|
|
if (StringUtils.trimToNull(this.defaultSchema) != null) {
|
|
database.setDefaultSchemaName(this.defaultSchema);
|
|
}
|
|
return database;
|
|
}
|
|
|
|
private void overrideHsqlDbImplementation(DatabaseFactory factory) {
|
|
List<Database> implementedDatabases = factory.getImplementedDatabases();
|
|
factory.clearRegistry();
|
|
removeCurrentHsqlDb(implementedDatabases);
|
|
implementedDatabases.forEach(factory::register);
|
|
factory.register(new HsqlDatabase());
|
|
}
|
|
|
|
private void removeCurrentHsqlDb(List<Database> implementedDatabases) {
|
|
implementedDatabases.removeIf(db -> db instanceof liquibase.database.core.HsqlDatabase);
|
|
}
|
|
}
|
|
|