package dbmigrate.executor; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import dbmigrate.exceptions.ValidationException; import dbmigrate.model.db.Column; import dbmigrate.model.db.IColumn; import dbmigrate.model.db.TypeEnum; import dbmigrate.model.operation.AddColumnOperationDescriptor; public class AddColumnExecutor extends GeneralExecutor<AddColumnOperationDescriptor> { public AddColumnExecutor(Connection connection) { this.setConnection(connection); } public String createSql(AddColumnOperationDescriptor operation) { StringBuffer buf = new StringBuffer(); buf.append("ALTER TABLE \"").append(operation.getTableName()).append("\" ").append("ADD ").append(operation.getColumn().getSqlDescription() + "; "); if (operation.getColumn().getValueToSet() != null) { boolean R = 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 (!R) buf.append("'" + column.getValueToSet() + "'"); else buf.append("md5(random()::text)"); break; case TEXT: if (!R) buf.append("'" + column.getValueToSet() + "'"); else buf.append("md5(random()::text)"); break; case DATETIME: if (!R) buf.append("'" + column.getValueToSet() + "'"); else buf.append("NOW() - '1 day'::INTERVAL * ROUND(RANDOM() * 100*365)"); break; case DATE: if (!R) buf.append("'" + column.getValueToSet() + "'"); else buf.append("NOW() - '1 day'::INTERVAL * ROUND(RANDOM() * 100*365)"); break; case BINARY: if (!R) buf.append("B'" + column.getValueToSet() + "'"); else buf.append("B'10101010'"); break; default: if (!R) buf.append(column.getValueToSet() + ""); else buf.append("random()"); break; } buf.append(";"); } return buf.toString(); } public void execute(AddColumnOperationDescriptor operation) throws SQLException { Statement stmt = this.getConnection().createStatement(); stmt.executeUpdate(this.createSql(operation)); } public void validate(AddColumnOperationDescriptor operation) throws ValidationException { if (operation.getColumn().getType() == TypeEnum.VARCHAR && operation.getColumn().getLength() < 1) { throw new ValidationException("Varchar columns must have a positive length."); } } }