DatabaseOperation.java

  1. /*
  2.  *    Copyright 2010-2023 the original author or authors.
  3.  *
  4.  *    Licensed under the Apache License, Version 2.0 (the "License");
  5.  *    you may not use this file except in compliance with the License.
  6.  *    You may obtain a copy of the License at
  7.  *
  8.  *       https://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  *    Unless required by applicable law or agreed to in writing, software
  11.  *    distributed under the License is distributed on an "AS IS" BASIS,
  12.  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  *    See the License for the specific language governing permissions and
  14.  *    limitations under the License.
  15.  */
  16. package org.apache.ibatis.migration.operations;

  17. import java.io.PrintStream;
  18. import java.io.PrintWriter;
  19. import java.sql.Connection;
  20. import java.sql.SQLException;
  21. import java.text.SimpleDateFormat;
  22. import java.util.List;

  23. import org.apache.ibatis.migration.Change;
  24. import org.apache.ibatis.migration.MigrationException;
  25. import org.apache.ibatis.migration.options.DatabaseOperationOption;

  26. public abstract class DatabaseOperation {

  27.   protected void insertChangelog(Change change, Connection con, DatabaseOperationOption option) {
  28.     try {
  29.       ChangelogOperation operation = new ChangelogOperation(con, option);
  30.       change.setAppliedTimestamp(generateAppliedTimeStampAsString());
  31.       operation.insert(change);
  32.     } catch (SQLException e) {
  33.       throw new MigrationException("Error querying last applied migration.  Cause: " + e, e);
  34.     }
  35.   }

  36.   protected List<Change> getChangelog(Connection con, DatabaseOperationOption option) {
  37.     try {
  38.       ChangelogOperation operation = new ChangelogOperation(con, option);
  39.       return operation.selectAll();
  40.     } catch (SQLException e) {
  41.       throw new MigrationException("Error querying last applied migration.  Cause: " + e, e);
  42.     }
  43.   }

  44.   protected boolean changelogExists(Connection con, DatabaseOperationOption option) {
  45.     ChangelogOperation operation = new ChangelogOperation(con, option);
  46.     return operation.tableExists();
  47.   }

  48.   protected String checkSkippedOrMissing(List<Change> changesInDb, List<Change> migrations) {
  49.     StringBuilder warnings = new StringBuilder();
  50.     String separator = System.lineSeparator();
  51.     int adjust = 0;
  52.     for (int i = 0; i < changesInDb.size(); i++) {
  53.       Change changeInDb = changesInDb.get(i);
  54.       int migrationIndex = migrations.indexOf(changeInDb);
  55.       if (migrationIndex == -1) {
  56.         // no corresponding migration script.
  57.         warnings.append("WARNING: Missing migration script. id='").append(changeInDb.getId()).append("', description='")
  58.             .append(changeInDb.getDescription()).append("'.").append(separator);
  59.         adjust++;
  60.       } else if (migrationIndex != i - adjust) {
  61.         // Unapplied migration script(s).
  62.         for (int j = i - adjust; j < migrationIndex; j++) {
  63.           adjust--;
  64.           warnings.append("WARNING: Migration script '").append(migrations.get(j).getFilename())
  65.               .append("' was not applied to the database.").append(separator);
  66.         }
  67.       }
  68.     }
  69.     return warnings.toString();
  70.   }

  71.   protected ScriptRunner getScriptRunner(Connection connection, DatabaseOperationOption option,
  72.       PrintStream printStream) {
  73.     try {
  74.       PrintWriter outWriter = printStream == null ? null : new PrintWriter(printStream);
  75.       ScriptRunner scriptRunner = new ScriptRunner(connection);
  76.       scriptRunner.setLogWriter(outWriter);
  77.       scriptRunner.setErrorLogWriter(outWriter);
  78.       scriptRunner.setStopOnError(option.isStopOnError());
  79.       scriptRunner.setThrowWarning(option.isThrowWarning());
  80.       scriptRunner.setEscapeProcessing(false);
  81.       scriptRunner.setAutoCommit(option.isAutoCommit());
  82.       scriptRunner.setDelimiter(option.getDelimiter());
  83.       scriptRunner.setFullLineDelimiter(option.isFullLineDelimiter());
  84.       scriptRunner.setSendFullScript(option.isSendFullScript());
  85.       scriptRunner.setRemoveCRs(option.isRemoveCRs());
  86.       return scriptRunner;
  87.     } catch (Exception e) {
  88.       throw new MigrationException("Error creating ScriptRunner.  Cause: " + e, e);
  89.     }
  90.   }

  91.   public static String generateAppliedTimeStampAsString() {
  92.     return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.sql.Date(System.currentTimeMillis()));
  93.   }

  94.   protected void println(PrintStream printStream) {
  95.     if (printStream != null) {
  96.       printStream.println();
  97.     }
  98.   }

  99.   protected void println(PrintStream printStream, String text) {
  100.     if (printStream != null) {
  101.       printStream.println(text);
  102.     }
  103.   }
  104. }