package org.test4j.module.dbfit.fixture.fit;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import org.test4j.module.database.utility.DBHelper;
import org.test4j.module.dbfit.environment.DbFitEnvironment;
import org.test4j.module.dbfit.exception.HasMarkedException;
import org.test4j.module.dbfit.model.DbParameterAccessor;
import fit.Parse;
public class DeleteFixture extends InsertFixture {
public DeleteFixture(DbFitEnvironment env, String tableName) {
super(env, tableName);
}
public void doRows(Parse rows) {
if ((tableName == null || tableName.trim().length() == 0) && args.length > 0) {
tableName = args[0];
} else if (tableName == null) {
tableName = rows.parts.text();
rows = rows.more;
}
PreparedStatement statement = null;
try {
initParameters(rows.parts);// init parameters from the first row
statement = buildDeleteCommand(tableName, accessors);
Parse row = rows;
while ((row = row.more) != null) {
deleteRowData(statement, row);
right(row);
}
} catch (Throwable e) {
e.printStackTrace();
if (!(e instanceof HasMarkedException)) {
exception(rows.parts, e);
}
} finally {
DBHelper.closeStatement(statement);
statement = null;
}
}
public PreparedStatement buildDeleteCommand(String tableName, DbParameterAccessor[] accessors) throws SQLException {
String delete = environment.buildDeleteCommand(tableName, accessors);
PreparedStatement cs = (environment.supportsOuputOnInsert()) ? environment.connect().prepareCall(delete)
: environment.connect().prepareStatement(delete, Statement.RETURN_GENERATED_KEYS);
for (int i = 0; i < accessors.length; i++) {
accessors[i].bindTo(this, cs, i + 1);
}
return cs;
}
protected void deleteRowData(PreparedStatement statement, Parse row) {
Parse cell = row.parts;
try {
statement.clearParameters();
for (int column = 0; column < accessors.length; column++, cell = cell.more) {
int direction = accessors[column].getDirection();
if (direction == DbParameterAccessor.INPUT) {
columnBindings[column].doCell(this, cell);
}
}
statement.execute();
} catch (Throwable e) {
exception(cell, e);
throw new HasMarkedException(e);
}
}
}