package uk.co.optimisticpanda.dropwizard.dbdeploy;
import java.sql.SQLException;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.dbdeploy.ChangeScriptApplier;
import com.dbdeploy.database.QueryStatementSplitter;
import com.dbdeploy.database.changelog.QueryExecuter;
import com.dbdeploy.scripts.ChangeScript;
import com.google.common.base.Throwables;
public class ScriptApplier implements ChangeScriptApplier {
private static Logger log = LoggerFactory.getLogger(ScriptApplier.class);
private final QueryExecuter queryExecuter;
private final QueryStatementSplitter splitter;
public ScriptApplier(QueryExecuter queryExecuter, QueryStatementSplitter splitter) {
this.queryExecuter = queryExecuter;
this.splitter = splitter;
}
@Override
public void apply(List<ChangeScript> changeScripts) {
begin();
for (ChangeScript changeScript : changeScripts) {
String content = changeScript.getContent();
log.info("Applying:\n" + content + "\n...");
applyChangeScript(content);
}
commitTransaction();
}
public void apply(String sql) {
begin();
applyChangeScript(sql);
commitTransaction();
}
public void begin() {
try {
queryExecuter.setAutoCommit(false);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
protected void applyChangeScript(String sql) {
List<String> statements = splitter.split(sql);
for (int i = 0; i < statements.size(); i++) {
String statement = statements.get(i);
try {
if (statements.size() > 1) {
log.info(" -> statement " + (i + 1) + " of " + statements.size() + "...");
}
queryExecuter.execute(statement);
} catch (SQLException e) {
throw Throwables.propagate(e);
}
}
}
protected void commitTransaction() {
try {
queryExecuter.commit();
} catch (SQLException e) {
throw new RuntimeException();
}
}
}