Parcourir la source

Fix flyway baseline setup

pull/6/head
Kristijan Mitrovic il y a 4 ans
Parent
révision
01f9b9425f
1 fichiers modifiés avec 35 ajouts et 15 suppressions
  1. +35
    -15
      wizard-server/src/main/java/org/cobbzilla/wizard/server/listener/FlywayMigrationListener.java

+ 35
- 15
wizard-server/src/main/java/org/cobbzilla/wizard/server/listener/FlywayMigrationListener.java Voir le fichier

@@ -1,7 +1,9 @@
package org.cobbzilla.wizard.server.listener;

import lombok.Getter;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.cobbzilla.util.jdbc.ResultSetBean;
import org.cobbzilla.util.jdbc.UncheckedSqlException;
import org.cobbzilla.wizard.server.RestServer;
import org.cobbzilla.wizard.server.RestServerLifecycleListenerBase;
@@ -38,22 +40,17 @@ public class FlywayMigrationListener<C extends RestServerConfiguration> extends
protected boolean skipDefaultResolvers() { return false; }
protected MigrationResolver[] getResolvers() { return null; }

public String getBaselineVersion() { return DATE_FORMAT_YYYYMMDD.print(now())+"99"; }
public String getBaselineVersion() { return DATE_FORMAT_YYYYMMDD.print(now()) + "99"; }

public void migrate(PgRestServerConfiguration configuration) {
public void migrate(@NonNull final PgRestServerConfiguration configuration) {

// check to see if flyway tables exist
boolean baseline = false;
final String flywayTable = getFlywayTableName();
try {
configuration.execSql("SELECT * from " + flywayTable);
} catch (UncheckedSqlException e) {
if (e.getSqlException() != null && e.getSqlException() instanceof PSQLException && e.getMessage().contains(" does not exist")) {
log.warn(flywayTable + " table does not exist, will baseline DB");
baseline = true;
} else {
throw e;
}
final var flywayTable = getFlywayTableName();
final var baseline = checkIfBaseline(configuration, flywayTable);
final var baselineVersion = baseline ? MigrationVersion.fromVersion(getBaselineVersion())
: MigrationVersion.EMPTY;
if (baseline) {
log.warn(flywayTable + " table does not exist or is empty, will baseline DB with " + baselineVersion);
}

final DatabaseConfiguration dbConfig = configuration.getDatabase();
@@ -64,12 +61,11 @@ public class FlywayMigrationListener<C extends RestServerConfiguration> extends
.skipDefaultResolvers(skipDefaultResolvers())
.resolvers(resolvers != null ? resolvers : new MigrationResolver[0])
.baselineOnMigrate(baseline)
.baselineVersion(MigrationVersion.fromVersion(getBaselineVersion())));
.baselineVersion(baselineVersion));

int applied;
try {
applied = flyway.migrate();

} catch (FlywaySqlScriptException e) {
if (e.getStatement().trim().toLowerCase().startsWith("drop ") && e.getMessage().contains("does not exist")) {
log.info("migrate: drop statement ("+e.getStatement()+") failed, ignoring: "+e, e);
@@ -94,4 +90,28 @@ public class FlywayMigrationListener<C extends RestServerConfiguration> extends
log.info("migrate: successfully applied "+applied+" migrations");
}

private boolean checkIfBaseline(@NonNull final PgRestServerConfiguration configuration,
@NonNull final String flywayTable) {
final ResultSetBean rs;
try {
rs = configuration.execSql("SELECT 1 FROM " + flywayTable + " LIMIT 1");
} catch (UncheckedSqlException e) {
if (e.getSqlException() == null || !(e.getSqlException() instanceof PSQLException)
|| !e.getMessage().contains(" does not exist")) {
throw e;
}
// else, if table is not present, set baseline:
return true;
}

// Also, if present flyway migration history table is empty -> set baseline
if (rs.rowCount() == 0) {
// dropping the existing empty table so flyway inner baseline will work properly
configuration.execSql("DROP TABLE " + flywayTable);
return true;
}

return false;
}

}

Chargement…
Annuler
Enregistrer