diff --git a/wizard-server/src/main/java/org/cobbzilla/wizard/server/listener/FlywayMigrationListener.java b/wizard-server/src/main/java/org/cobbzilla/wizard/server/listener/FlywayMigrationListener.java index eae346c..79d5d01 100644 --- a/wizard-server/src/main/java/org/cobbzilla/wizard/server/listener/FlywayMigrationListener.java +++ b/wizard-server/src/main/java/org/cobbzilla/wizard/server/listener/FlywayMigrationListener.java @@ -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 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 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 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; + } + }