package dbfit.fixture;
import dbfit.api.DBEnvironment;
import dbfit.api.DbEnvironmentFactory;
import dbfit.util.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import static dbfit.util.SymbolUtil.isSymbolGetter;
public class Query extends RowSetFixture {
private DBEnvironment dbEnvironment;
private String queryOrSymbol;
private boolean isOrdered;
public Query() {
dbEnvironment = DbEnvironmentFactory.getDefaultEnvironment();
isOrdered = false;
}
public Query(DBEnvironment environment, String queryOrSymbol) {
this(environment, queryOrSymbol, false);
}
public Query(DBEnvironment environment, String queryOrSymbol, boolean isOrdered) {
this.dbEnvironment = environment;
this.queryOrSymbol = queryOrSymbol;
this.isOrdered = isOrdered;
}
public MatchableDataTable getDataTable() throws SQLException {
if (queryOrSymbol == null) {
queryOrSymbol = args[0];
}
if (isSymbolGetter(queryOrSymbol)) {
return new MatchableDataTable(getFromSymbol());
}
Log.log("Query: '%s'", queryOrSymbol);
try (PreparedStatement st =
dbEnvironment.createStatementWithBoundFixtureSymbols(
FitNesseTestHost.getInstance(), queryOrSymbol)) {
return new MatchableDataTable(new DataTable(st.executeQuery()));
}
}
private DataTable getFromSymbol() throws SQLException {
Object o = dbfit.util.SymbolUtil.getSymbol(queryOrSymbol);
if (o instanceof ResultSet) {
return new DataTable((ResultSet) o);
} else if (o instanceof DataTable) {
return (DataTable) o;
}
throw new UnsupportedOperationException("Stored queries can only be used on symbols that contain result sets");
}
protected boolean isOrdered() {
return isOrdered;
}
@SuppressWarnings("unchecked")
@Override
protected Class getJavaClassForColumn(DataColumn col) throws ClassNotFoundException, SQLException {
return dbEnvironment.getJavaClass(col.getDbTypeName());
}
}