package org.jumpmind.db.util;
import org.jumpmind.db.model.Database;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.platform.IDdlBuilder;
import org.jumpmind.db.sql.LogSqlResultsListener;
import org.jumpmind.db.sql.SqlScript;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ConfigDatabaseUpgrader {
protected static final Logger log = LoggerFactory.getLogger(ConfigDatabaseUpgrader.class);
protected String tablePrefix = "SYM";
protected IDatabasePlatform configDatabasePlatform;
protected boolean logOutput = true;
protected String schemaXml;
public ConfigDatabaseUpgrader(String schemaXml, IDatabasePlatform configDatabasePlatform,
boolean logOutput, String tablePrefix) {
this.configDatabasePlatform = configDatabasePlatform;
this.logOutput = logOutput;
this.schemaXml = schemaXml;
this.tablePrefix = tablePrefix;
}
public ConfigDatabaseUpgrader() {
}
public boolean upgrade() {
try {
if (logOutput) {
log.info("Checking if config tables need created or altered");
}
Database modelFromXml = configDatabasePlatform.readDatabaseFromXml(schemaXml, true);
configDatabasePlatform.prefixDatabase(tablePrefix, modelFromXml);
Database modelFromDatabase = configDatabasePlatform.readFromDatabase(modelFromXml
.getTables());
IDdlBuilder builder = configDatabasePlatform.getDdlBuilder();
if (builder.isAlterDatabase(modelFromDatabase, modelFromXml)) {
if (logOutput) {
log.info("There are config tables that needed altered");
}
String delimiter = configDatabasePlatform.getDatabaseInfo()
.getSqlCommandDelimiter();
String alterSql = builder.alterDatabase(modelFromDatabase, modelFromXml);
log.debug("Alter SQL generated: {}", alterSql);
SqlScript script = new SqlScript(alterSql, configDatabasePlatform.getSqlTemplate(),
true, false, false, delimiter, null);
if (logOutput) {
script.setListener(new LogSqlResultsListener(log));
}
script.execute(configDatabasePlatform.getDatabaseInfo()
.isRequiresAutoCommitForDdl());
if (logOutput) {
log.info("Done with auto update of config tables");
}
return true;
} else {
return false;
}
} catch (RuntimeException ex) {
throw ex;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
public void setLogOutput(boolean logOutput) {
this.logOutput = logOutput;
}
public boolean isLogOutput() {
return logOutput;
}
public void setConfigDatabasePlatform(IDatabasePlatform configDatabasePlatform) {
this.configDatabasePlatform = configDatabasePlatform;
}
public IDatabasePlatform getConfigDatabasePlatform() {
return configDatabasePlatform;
}
public void setSchemaXml(String schemaXml) {
this.schemaXml = schemaXml;
}
public String getSchemaXml() {
return schemaXml;
}
public void setTablePrefix(String tablePrefix) {
this.tablePrefix = tablePrefix;
}
public String getTablePrefix() {
return tablePrefix;
}
}