package dbfit.api;
import dbfit.fixture.StatementExecution;
import dbfit.util.DbParameterAccessor;
import dbfit.util.Direction;
import dbfit.util.NameNormaliser;
import java.sql.SQLException;
import java.util.Map;
import static dbfit.util.Direction.INPUT;
import static dbfit.util.Direction.OUTPUT;
public class DbTable implements DbObject {
private DBEnvironment dbEnvironment;
private String tableOrViewName;
private Map<String, DbParameterAccessor> columns;
public DbTable(DBEnvironment dbEnvironment, String tableName)
throws SQLException {
this.dbEnvironment = dbEnvironment;
this.tableOrViewName = tableName;
columns = dbEnvironment.getAllColumns(tableName);
if (columns.isEmpty()) {
throw new SQLException("Cannot retrieve list of columns for "
+ tableName + " - check spelling and access rights");
}
}
public StatementExecution buildPreparedStatement(
DbParameterAccessor[] accessors) throws SQLException {
StatementExecution statement = dbEnvironment.createStatementExecution(dbEnvironment
.buildInsertPreparedStatement(tableOrViewName, accessors));
for (int i = 0; i < accessors.length; i++) {
accessors[i].bindTo(statement, i + 1);
}
return statement;
}
public DbParameterAccessor getDbParameterAccessor(String columnName,
Direction expectedDirection) {
String normalisedName = NameNormaliser.normaliseName(columnName);
DbParameterAccessor accessor = columns.get(normalisedName);
if (null == accessor) {
throw new RuntimeException(
"No such database column or parameter: '" + normalisedName + "'");
}
if (accessor.hasDirection(INPUT)
&& expectedDirection == OUTPUT) {
accessor = dbEnvironment
.createAutogeneratedPrimaryKeyAccessor(accessor);
}
return accessor;
}
}