DatabaseOperation.java
/*
* Copyright 2010-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ibatis.migration.operations;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.List;
import org.apache.ibatis.migration.Change;
import org.apache.ibatis.migration.MigrationException;
import org.apache.ibatis.migration.options.DatabaseOperationOption;
public abstract class DatabaseOperation {
protected void insertChangelog(Change change, Connection con, DatabaseOperationOption option) {
try {
ChangelogOperation operation = new ChangelogOperation(con, option);
change.setAppliedTimestamp(generateAppliedTimeStampAsString());
operation.insert(change);
} catch (SQLException e) {
throw new MigrationException("Error querying last applied migration. Cause: " + e, e);
}
}
protected List<Change> getChangelog(Connection con, DatabaseOperationOption option) {
try {
ChangelogOperation operation = new ChangelogOperation(con, option);
return operation.selectAll();
} catch (SQLException e) {
throw new MigrationException("Error querying last applied migration. Cause: " + e, e);
}
}
protected boolean changelogExists(Connection con, DatabaseOperationOption option) {
ChangelogOperation operation = new ChangelogOperation(con, option);
return operation.tableExists();
}
protected String checkSkippedOrMissing(List<Change> changesInDb, List<Change> migrations) {
StringBuilder warnings = new StringBuilder();
String separator = System.lineSeparator();
int adjust = 0;
for (int i = 0; i < changesInDb.size(); i++) {
Change changeInDb = changesInDb.get(i);
int migrationIndex = migrations.indexOf(changeInDb);
if (migrationIndex == -1) {
// no corresponding migration script.
warnings.append("WARNING: Missing migration script. id='").append(changeInDb.getId()).append("', description='")
.append(changeInDb.getDescription()).append("'.").append(separator);
adjust++;
} else if (migrationIndex != i - adjust) {
// Unapplied migration script(s).
for (int j = i - adjust; j < migrationIndex; j++) {
adjust--;
warnings.append("WARNING: Migration script '").append(migrations.get(j).getFilename())
.append("' was not applied to the database.").append(separator);
}
}
}
return warnings.toString();
}
protected ScriptRunner getScriptRunner(Connection connection, DatabaseOperationOption option,
PrintStream printStream) {
try {
PrintWriter outWriter = printStream == null ? null : new PrintWriter(printStream);
ScriptRunner scriptRunner = new ScriptRunner(connection);
scriptRunner.setLogWriter(outWriter);
scriptRunner.setErrorLogWriter(outWriter);
scriptRunner.setStopOnError(option.isStopOnError());
scriptRunner.setThrowWarning(option.isThrowWarning());
scriptRunner.setEscapeProcessing(false);
scriptRunner.setAutoCommit(option.isAutoCommit());
scriptRunner.setDelimiter(option.getDelimiter());
scriptRunner.setFullLineDelimiter(option.isFullLineDelimiter());
scriptRunner.setSendFullScript(option.isSendFullScript());
scriptRunner.setRemoveCRs(option.isRemoveCRs());
return scriptRunner;
} catch (Exception e) {
throw new MigrationException("Error creating ScriptRunner. Cause: " + e, e);
}
}
public static String generateAppliedTimeStampAsString() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.sql.Date(System.currentTimeMillis()));
}
protected void println(PrintStream printStream) {
if (printStream != null) {
printStream.println();
}
}
protected void println(PrintStream printStream, String text) {
if (printStream != null) {
printStream.println(text);
}
}
}