Coverage Report - liquibase.sqlgenerator.core.UpdateGenerator
 
Classes in this File Line Coverage Branch Coverage Complexity
UpdateGenerator
50%
16/32
36%
8/22
4.667
 
 1  
 package liquibase.sqlgenerator.core;
 2  
 
 3  
 import liquibase.database.Database;
 4  
 import liquibase.database.typeconversion.TypeConverterFactory;
 5  
 import liquibase.exception.ValidationErrors;
 6  
 import liquibase.sql.Sql;
 7  
 import liquibase.sql.UnparsedSql;
 8  
 import liquibase.sqlgenerator.SqlGenerator;
 9  
 import liquibase.sqlgenerator.SqlGeneratorChain;
 10  
 import liquibase.statement.core.UpdateStatement;
 11  
 
 12  
 import java.util.Date;
 13  
 
 14  12
 public class UpdateGenerator extends AbstractSqlGenerator<UpdateStatement> {
 15  
 
 16  
     public ValidationErrors validate(UpdateStatement updateStatement, Database database,
 17  
             SqlGeneratorChain sqlGeneratorChain) {
 18  0
         ValidationErrors validationErrors = new ValidationErrors();
 19  0
         validationErrors.checkRequiredField("tableName", updateStatement.getTableName());
 20  0
         validationErrors.checkRequiredField("columns", updateStatement.getNewColumnValues());
 21  0
         return validationErrors;
 22  
     }
 23  
 
 24  
     public Sql[] generateSql(UpdateStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
 25  2
         StringBuffer sql = new StringBuffer("UPDATE "
 26  
                 + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " SET");
 27  2
         for (String column : statement.getNewColumnValues().keySet()) {
 28  2
             sql.append(" ")
 29  
                     .append(database.escapeColumnName(statement.getSchemaName(), statement.getTableName(), column))
 30  
                     .append(" = ");
 31  2
             sql.append(convertToString(statement.getNewColumnValues().get(column), database));
 32  2
             sql.append(",");
 33  
         }
 34  
 
 35  2
         sql.deleteCharAt(sql.lastIndexOf(","));
 36  2
         if (statement.getWhereClause() != null) {
 37  2
             String fixedWhereClause = "WHERE " + statement.getWhereClause().trim();
 38  2
             for (Object param : statement.getWhereParameters()) {
 39  0
                 fixedWhereClause = fixedWhereClause.replaceFirst("\\?", convertToString(param, database));
 40  
             }
 41  2
             sql.append(" ").append(fixedWhereClause);
 42  
         }
 43  
 
 44  2
         return new Sql[] { new UnparsedSql(sql.toString()) };
 45  
     }
 46  
 
 47  
     private String convertToString(Object newValue, Database database) {
 48  
         String sqlString;
 49  2
         if (newValue == null || newValue.toString().equalsIgnoreCase("NULL")) {
 50  0
             sqlString = "NULL";
 51  2
         } else if (newValue instanceof String && database.shouldQuoteValue(((String) newValue))) {
 52  2
             sqlString = "'" + database.escapeStringForDatabase(newValue.toString()) + "'";
 53  0
         } else if (newValue instanceof Date) {
 54  
             // converting java.util.Date to java.sql.Date
 55  0
             Date date = (Date) newValue;
 56  0
             if (date.getClass().equals(java.util.Date.class)) {
 57  0
                 date = new java.sql.Date(date.getTime());
 58  
             }
 59  
 
 60  0
             sqlString = database.getDateLiteral(date);
 61  0
         } else if (newValue instanceof Boolean) {
 62  0
             if (((Boolean) newValue)) {
 63  0
                 sqlString = TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType()
 64  
                         .getTrueBooleanValue();
 65  
             } else {
 66  0
                 sqlString = TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType()
 67  
                         .getFalseBooleanValue();
 68  
             }
 69  
         } else {
 70  0
             sqlString = newValue.toString();
 71  
         }
 72  2
         return sqlString;
 73  
     }
 74  
 }