package org.skife.jdbi.v2;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.Token;
import org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException;
import org.skife.jdbi.v2.tweak.StatementLocator;
import java.util.ArrayList;
import java.util.List;
public class Script
{
private final Handle handle;
private final StatementLocator locator;
private final String name;
private final StatementContext statementContext;
Script(Handle h, StatementLocator locator, String name, StatementContext statementContext)
{
this.handle = h;
this.locator = locator;
this.name = name;
this.statementContext = statementContext;
}
public int[] execute() {
final List<String> statements = getStatements();
Batch b = handle.createBatch();
for (String s : statements) {
b.add(s);
}
return b.execute();
}
public void executeAsSeparateStatements() {
for (String s : getStatements()) {
handle.execute(s);
}
}
public List<String> getStatements() {
final String script;
try {
script = locator.locate(name, statementContext);
} catch (Exception e) {
throw new UnableToExecuteStatementException(String.format("Error while loading script [%s]", name), e, statementContext);
}
return splitToStatements(script);
}
private List<String> splitToStatements(String script) {
final List<String> statements = new ArrayList<String>();
String lastStatement = new SqlScriptParser(new SqlScriptParser.TokenHandler() {
@Override
public void handle(Token t, StringBuilder sb) {
addStatement(sb.toString(), statements);
sb.setLength(0);
}
}).parse(new ANTLRStringStream(script));
addStatement(lastStatement, statements);
return statements;
}
private void addStatement(String statement, List<String> statements) {
String trimmedStatement = statement.trim();
if (trimmedStatement.isEmpty()) {
return;
}
statements.add(trimmedStatement);
}
}