/** Returns the run status for the given ChangeSet */
  @Override
  public ChangeSet.RunStatus getRunStatus(ChangeSet changeSet)
      throws DatabaseException, DatabaseHistoryException {
    if (!hasDatabaseChangeLogTable()) {
      return ChangeSet.RunStatus.NOT_RAN;
    }

    RanChangeSet foundRan = getRanChangeSet(changeSet);

    if (foundRan == null) {
      return ChangeSet.RunStatus.NOT_RAN;
    } else {
      if (foundRan.getLastCheckSum() == null) {
        try {
          LogFactory.getLogger().info("Updating NULL md5sum for " + changeSet.toString());
          ExecutorService.getInstance()
              .getExecutor(this)
              .execute(
                  new RawSqlStatement(
                      "UPDATE "
                          + escapeTableName(
                              getLiquibaseSchemaName(), getDatabaseChangeLogTableName())
                          + " SET MD5SUM='"
                          + changeSet.generateCheckSum().toString()
                          + "' WHERE ID='"
                          + changeSet.getId()
                          + "' AND AUTHOR='"
                          + changeSet.getAuthor()
                          + "' AND FILENAME='"
                          + changeSet.getFilePath()
                          + "'"));

          this.commit();
        } catch (DatabaseException e) {
          throw new DatabaseException(e);
        }

        return ChangeSet.RunStatus.ALREADY_RAN;
      } else {
        if (foundRan.getLastCheckSum().equals(changeSet.generateCheckSum())) {
          return ChangeSet.RunStatus.ALREADY_RAN;
        } else {
          if (changeSet.shouldRunOnChange()) {
            return ChangeSet.RunStatus.RUN_AGAIN;
          } else {
            return ChangeSet.RunStatus.INVALID_MD5SUM;
            // throw new DatabaseHistoryException("MD5 Check for " + changeSet.toString() + "
            // failed");
          }
        }
      }
    }
  }
 @Override
 public void check(Database database, DatabaseChangeLog changeLog, ChangeSet changeSet)
     throws PreconditionFailedException, PreconditionErrorException {
   ObjectQuotingStrategy objectQuotingStrategy = null;
   if (changeSet == null) {
     objectQuotingStrategy = ObjectQuotingStrategy.LEGACY;
   } else {
     objectQuotingStrategy = changeSet.getObjectQuotingStrategy();
   }
   String changeLogFile = getChangeLogFile();
   if (changeLogFile == null) {
     changeLogFile = changeLog.getLogicalFilePath();
   }
   ChangeSet interestedChangeSet =
       new ChangeSet(
           getId(),
           getAuthor(),
           false,
           false,
           changeLogFile,
           null,
           null,
           false,
           objectQuotingStrategy,
           changeLog);
   RanChangeSet ranChangeSet;
   try {
     ranChangeSet = database.getRanChangeSet(interestedChangeSet);
   } catch (Exception e) {
     throw new PreconditionErrorException(e, changeLog, this);
   }
   if (ranChangeSet == null
       || ranChangeSet.getExecType() == null
       || !ranChangeSet.getExecType().ran) {
     throw new PreconditionFailedException(
         "Change Set '" + interestedChangeSet.toString(false) + "' has not been run",
         changeLog,
         this);
   }
 }