| 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 |  |               | 
  | 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 |  |  } |