package liquibase.sqlgenerator.core; import liquibase.database.Database; import liquibase.database.typeconversion.TypeConverterFactory; import liquibase.database.core.SQLiteDatabase; import liquibase.exception.ValidationErrors; import liquibase.sql.Sql; import liquibase.sql.UnparsedSql; import liquibase.sqlgenerator.SqlGenerator; import liquibase.sqlgenerator.SqlGeneratorChain; import liquibase.statement.core.DeleteStatement; import java.util.Date; public class DeleteGenerator extends AbstractSqlGenerator<DeleteStatement> { @Override public boolean supports(DeleteStatement statement, Database database) { return !(database instanceof SQLiteDatabase); } public ValidationErrors validate(DeleteStatement deleteStatement, Database database, SqlGeneratorChain sqlGeneratorChain) { ValidationErrors validationErrors = new ValidationErrors(); validationErrors.checkRequiredField("tableName", deleteStatement.getTableName()); return validationErrors; } public Sql[] generateSql(DeleteStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { StringBuffer sql = new StringBuffer("DELETE FROM " + database.escapeTableName(statement.getSchemaName(), statement.getTableName())); if (statement.getWhereClause() != null) { String fixedWhereClause = " WHERE " + statement.getWhereClause(); for (Object param : statement.getWhereParameters()) { fixedWhereClause = fixedWhereClause.replaceFirst("\\?", convertToString(param, database)); } sql.append(" ").append(fixedWhereClause); } return new Sql[]{new UnparsedSql(sql.toString())}; } private String convertToString(Object newValue, Database database) { String sqlString; if (newValue == null) { sqlString = "NULL"; } else if (newValue instanceof String && database.shouldQuoteValue(((String) newValue))) { sqlString = "'" + newValue + "'"; } else if (newValue instanceof Date) { sqlString = database.getDateLiteral(((Date) newValue)); } else if (newValue instanceof Boolean) { if (((Boolean) newValue)) { sqlString = TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType().getTrueBooleanValue(); } else { sqlString = TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType().getFalseBooleanValue(); } } else { sqlString = newValue.toString(); } return sqlString; } }