package com.dbdeploy.appliers; import com.dbdeploy.ChangeScriptApplier; import com.dbdeploy.database.QueryStatementSplitter; import com.dbdeploy.database.changelog.DatabaseSchemaVersionManager; import com.dbdeploy.database.changelog.QueryExecuter; import com.dbdeploy.exceptions.ChangeScriptFailedException; import com.dbdeploy.scripts.ChangeScript; import java.sql.SQLException; import java.util.List; public class DirectToDbApplier implements ChangeScriptApplier { private final QueryExecuter queryExecuter; private final DatabaseSchemaVersionManager schemaVersionManager; private final QueryStatementSplitter splitter; public DirectToDbApplier(QueryExecuter queryExecuter, DatabaseSchemaVersionManager schemaVersionManager, QueryStatementSplitter splitter) { this.queryExecuter = queryExecuter; this.schemaVersionManager = schemaVersionManager; this.splitter = splitter; } public void apply(List<ChangeScript> changeScript) { begin(); for (ChangeScript script : changeScript) { System.err.println("Applying " + script + "..."); applyChangeScript(script); insertToSchemaVersionTable(script); commitTransaction(); } } public void begin() { try { queryExecuter.setAutoCommit(false); } catch (SQLException e) { throw new RuntimeException(e); } } protected void applyChangeScript(ChangeScript script) { List<String> statements = splitter.split(script.getContent()); for (int i = 0; i < statements.size(); i++) { String statement = statements.get(i); try { if (statements.size() > 1) { System.err.println(" -> statement " + (i+1) + " of " + statements.size() + "..."); } queryExecuter.execute(statement); } catch (SQLException e) { throw new ChangeScriptFailedException(e, script, i+1, statement); } } } protected void insertToSchemaVersionTable(ChangeScript changeScript) { schemaVersionManager.recordScriptApplied(changeScript); } protected void commitTransaction() { try { queryExecuter.commit(); } catch (SQLException e) { throw new RuntimeException(); } } }