package dbmigrate.executor;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import dbmigrate.model.db.Column;
import dbmigrate.model.db.IColumn;
import dbmigrate.model.operation.ChangeColumnOperationDescriptor;
public class ChangeColumnExecutor extends GeneralExecutor<ChangeColumnOperationDescriptor> {
public ChangeColumnExecutor(Connection connection) {
this.setConnection(connection);
}
public String createSql(ChangeColumnOperationDescriptor operation) {
StringBuilder buf = new StringBuilder();
buf.append("ALTER TABLE \"").append(operation.getTableName()).append("\" ").append("CHANGE ").append(operation.getOldColumnName()).append(" ");
buf.append(operation.getColumn().getSqlDescription());
buf.append(";");
if (operation.getColumn().getValueToSet() != null) {
boolean random = operation.getColumn().getValueToSet().equals(Column.RANDOM);
IColumn column = operation.getColumn();
buf.append("UPDATE \"");
buf.append(operation.getTableName());
buf.append("\" SET ");
buf.append(column.getName());
buf.append("=");
switch (column.getType()) {
case VARCHAR:
if (!random) {
buf.append("'").append(column.getValueToSet()).append("'");
} else {
buf.append("md5(random()::text)");
}
break;
case TEXT:
if (!random) {
buf.append("'").append(column.getValueToSet()).append("'");
} else {
buf.append("md5(random()::text)");
}
break;
case DATETIME:
if (!random) {
buf.append("'").append(column.getValueToSet()).append("'");
} else {
buf.append("NOW() - '1 day'::INTERVAL * ROUND(RANDOM() * 100*365)");
}
break;
case DATE:
if (!random) {
buf.append("'").append(column.getValueToSet()).append("'");
} else {
buf.append("NOW() - '1 day'::INTERVAL * ROUND(RANDOM() * 100*365)");
}
break;
case BINARY:
if (!random) {
buf.append("B'").append(column.getValueToSet()).append("'");
} else {
buf.append("B'10101010'");
}
break;
default:
if (!random) {
buf.append(column.getValueToSet()).append("");
} else {
buf.append("random()");
}
break;
}
buf.append(";");
}
return buf.toString();
}
public void execute(ChangeColumnOperationDescriptor operation) {
try {
Statement stmt = this.getConnection().createStatement();
stmt.executeUpdate(this.createSql(operation));
} catch (SQLException e) {
// TODO Throw project-specific exception.
e.printStackTrace();
}
}
}