package liquibase.sqlgenerator.core;
import liquibase.database.Database;
import liquibase.database.typeconversion.TypeConverterFactory;
import liquibase.exception.ValidationErrors;
import liquibase.sql.Sql;
import liquibase.sql.UnparsedSql;
import liquibase.sqlgenerator.SqlGenerator;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.statement.core.InsertStatement;
import java.util.Date;
public class InsertGenerator extends AbstractSqlGenerator<InsertStatement> {
public ValidationErrors validate(InsertStatement insertStatement, Database database, SqlGeneratorChain sqlGeneratorChain) {
ValidationErrors validationErrors = new ValidationErrors();
validationErrors.checkRequiredField("tableName", insertStatement.getTableName());
validationErrors.checkRequiredField("columns", insertStatement.getColumnValues());
if (insertStatement.getSchemaName() != null && !database.supportsSchemas()) {
validationErrors.addError("Database does not support schemas");
}
return validationErrors;
}
public Sql[] generateSql(InsertStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
StringBuffer sql = new StringBuffer("INSERT INTO " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " (");
for (String column : statement.getColumnValues().keySet()) {
sql.append(database.escapeColumnName(statement.getSchemaName(), statement.getTableName(), column)).append(", ");
}
sql.deleteCharAt(sql.lastIndexOf(" "));
sql.deleteCharAt(sql.lastIndexOf(","));
sql.append(") VALUES (");
for (String column : statement.getColumnValues().keySet()) {
Object newValue = statement.getColumnValues().get(column);
if (newValue == null || newValue.toString().equalsIgnoreCase("NULL")) {
sql.append("NULL");
} else if (newValue instanceof String && database.shouldQuoteValue(((String) newValue))) {
sql.append("'").append(database.escapeStringForDatabase((String) newValue)).append("'");
} else if (newValue instanceof Date) {
sql.append(database.getDateLiteral(((Date) newValue)));
} else if (newValue instanceof Boolean) {
if (((Boolean) newValue)) {
sql.append(TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType().getTrueBooleanValue());
} else {
sql.append(TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType().getFalseBooleanValue());
}
} else {
sql.append(newValue);
}
sql.append(", ");
}
sql.deleteCharAt(sql.lastIndexOf(" "));
sql.deleteCharAt(sql.lastIndexOf(","));
sql.append(")");
return new Sql[] {
new UnparsedSql(sql.toString())
};
}
}