|
|
@@ -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; |
|
|
|
} |
|
|
|
|
|
|
|
} |