| 1 |  |  package liquibase.sqlgenerator.core; | 
  | 2 |  |   | 
  | 3 |  |  import java.util.List; | 
  | 4 |  |   | 
  | 5 |  |  import liquibase.change.Change; | 
  | 6 |  |  import liquibase.change.core.TagDatabaseChange; | 
  | 7 |  |  import liquibase.changelog.ChangeSet; | 
  | 8 |  |  import liquibase.database.Database; | 
  | 9 |  |  import liquibase.exception.LiquibaseException; | 
  | 10 |  |  import liquibase.exception.UnexpectedLiquibaseException; | 
  | 11 |  |  import liquibase.exception.ValidationErrors; | 
  | 12 |  |  import liquibase.sql.Sql; | 
  | 13 |  |  import liquibase.sqlgenerator.SqlGeneratorChain; | 
  | 14 |  |  import liquibase.sqlgenerator.SqlGeneratorFactory; | 
  | 15 |  |  import liquibase.statement.DatabaseFunction; | 
  | 16 |  |  import liquibase.statement.SqlStatement; | 
  | 17 |  |  import liquibase.statement.core.InsertStatement; | 
  | 18 |  |  import liquibase.statement.core.MarkChangeSetRanStatement; | 
  | 19 |  |  import liquibase.statement.core.UpdateStatement; | 
  | 20 |  |  import liquibase.util.LiquibaseUtil; | 
  | 21 |  |  import liquibase.util.StringUtils; | 
  | 22 |  |   | 
  | 23 | 28 |  public class MarkChangeSetRanGenerator extends AbstractSqlGenerator<MarkChangeSetRanStatement> { | 
  | 24 |  |   | 
  | 25 |  |      public ValidationErrors validate(MarkChangeSetRanStatement statement, Database database, | 
  | 26 |  |              SqlGeneratorChain sqlGeneratorChain) { | 
  | 27 | 15 |          ValidationErrors validationErrors = new ValidationErrors(); | 
  | 28 | 15 |          validationErrors.checkRequiredField("changeSet", statement.getChangeSet()); | 
  | 29 |  |   | 
  | 30 | 15 |          return validationErrors; | 
  | 31 |  |      } | 
  | 32 |  |   | 
  | 33 |  |      public Sql[] generateSql(MarkChangeSetRanStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { | 
  | 34 | 0 |          String dateValue = database.getCurrentDateTimeFunction(); | 
  | 35 |  |   | 
  | 36 | 0 |          ChangeSet changeSet = statement.getChangeSet(); | 
  | 37 |  |   | 
  | 38 |  |          SqlStatement runStatement; | 
  | 39 |  |          try { | 
  | 40 | 0 |              if (statement.getExecType().equals(ChangeSet.ExecType.FAILED) | 
  | 41 |  |                      || statement.getExecType().equals(ChangeSet.ExecType.SKIPPED)) { | 
  | 42 | 0 |                  return new Sql[0];  | 
  | 43 | 0 |              } else if (statement.getExecType().ranBefore) { | 
  | 44 | 0 |                  runStatement = new UpdateStatement(database.getLiquibaseSchemaName(), | 
  | 45 |  |                          database.getDatabaseChangeLogTableName()) | 
  | 46 |  |                          .addNewColumnValue("DATEEXECUTED", new DatabaseFunction(dateValue)) | 
  | 47 |  |                          .addNewColumnValue("MD5SUM", changeSet.generateCheckSum().toString()) | 
  | 48 |  |                          .addNewColumnValue("EXECTYPE", statement.getExecType().value) | 
  | 49 |  |                          .setWhereClause("ID=? AND AUTHOR=? AND FILENAME=?") | 
  | 50 |  |                          .addWhereParameters(changeSet.getId(), changeSet.getAuthor(), changeSet.getFilePath()); | 
  | 51 |  |              } else { | 
  | 52 | 0 |                  runStatement = new InsertStatement(database.getLiquibaseSchemaName(), | 
  | 53 |  |                          database.getDatabaseChangeLogTableName()).addColumnValue("ID", changeSet.getId()) | 
  | 54 |  |                          .addColumnValue("AUTHOR", changeSet.getAuthor()) | 
  | 55 |  |                          .addColumnValue("FILENAME", changeSet.getFilePath()) | 
  | 56 |  |                          .addColumnValue("DATEEXECUTED", new DatabaseFunction(dateValue)) | 
  | 57 |  |                          .addColumnValue("ORDEREXECUTED", database.getNextChangeSetSequenceValue()) | 
  | 58 |  |                          .addColumnValue("MD5SUM", changeSet.generateCheckSum().toString()) | 
  | 59 |  |                          .addColumnValue("DESCRIPTION", limitSize(changeSet.getDescription())) | 
  | 60 |  |                          .addColumnValue("COMMENTS", limitSize(StringUtils.trimToEmpty(changeSet.getComments()))) | 
  | 61 |  |                          .addColumnValue("EXECTYPE", statement.getExecType().value) | 
  | 62 |  |                          .addColumnValue("LIQUIBASE", LiquibaseUtil.getBuildVersion().replaceAll("SNAPSHOT", "SNP")); | 
  | 63 |  |   | 
  | 64 | 0 |                  String tag = null; | 
  | 65 | 0 |                  List<Change> changes = changeSet.getChanges(); | 
  | 66 | 0 |                  if (changes != null && changes.size() == 1) { | 
  | 67 | 0 |                      Change change = changes.get(0); | 
  | 68 | 0 |                      if (change instanceof TagDatabaseChange) { | 
  | 69 | 0 |                          TagDatabaseChange tagChange = (TagDatabaseChange) change; | 
  | 70 | 0 |                          tag = tagChange.getTag(); | 
  | 71 |  |                      } | 
  | 72 |  |                  } | 
  | 73 | 0 |                  if (tag != null) { | 
  | 74 | 0 |                      ((InsertStatement) runStatement).addColumnValue("TAG", tag); | 
  | 75 |  |                  } | 
  | 76 |  |              } | 
  | 77 | 0 |          } catch (LiquibaseException e) { | 
  | 78 | 0 |              throw new UnexpectedLiquibaseException(e); | 
  | 79 | 0 |          } | 
  | 80 |  |   | 
  | 81 | 0 |          return SqlGeneratorFactory.getInstance().generateSql(runStatement, database); | 
  | 82 |  |      } | 
  | 83 |  |   | 
  | 84 |  |      private String limitSize(String string) { | 
  | 85 | 0 |          int maxLength = 255; | 
  | 86 | 0 |          if (string.length() > maxLength) { | 
  | 87 | 0 |              return string.substring(0, maxLength - 3) + "..."; | 
  | 88 |  |          } | 
  | 89 | 0 |          return string; | 
  | 90 |  |      } | 
  | 91 |  |  } |