#689 - Refactor DB Migration to support "V" prefix

This commit is contained in:
Robin Bygrave
2016-05-02 16:25:27 +12:00
parent 9da5ce01a7
commit 07fe1cde6b
6 changed files with 45 additions and 53 deletions
@@ -60,6 +60,11 @@ public class DbMigrationConfig {
protected String applySuffix = ".sql";
/**
* Set this to "V" to be compatible with FlywayDB.
*/
protected String applyPrefix = "";
protected String modelSuffix = ".model.xml";
protected boolean includeGeneratedFileComment;
@@ -177,6 +182,20 @@ public class DbMigrationConfig {
this.applySuffix = applySuffix;
}
/**
* Return the apply prefix.
*/
public String getApplyPrefix() {
return applyPrefix;
}
/**
* Set the apply prefix. This might be set to "V" for use with FlywayDB.
*/
public void setApplyPrefix(String applyPrefix) {
this.applyPrefix = applyPrefix;
}
/**
* Return true if the generated file comment should be included.
*/
@@ -351,6 +370,7 @@ public class DbMigrationConfig {
} else {
modelPath = properties.get("migration.modelPath", modelPath);
}
applyPrefix = properties.get("migration.applyPrefix", applyPrefix);
applySuffix = properties.get("migration.applySuffix", applySuffix);
modelSuffix = properties.get("migration.modelSuffix", modelSuffix);
includeGeneratedFileComment = properties.getBoolean("migration.includeGeneratedFileComment", includeGeneratedFileComment);
@@ -360,7 +380,7 @@ public class DbMigrationConfig {
generate = properties.getBoolean("migration.generate", generate);
version = properties.get("migration.version", version);
this.name = properties.get("migration.name", this.name);
name = properties.get("migration.name", name);
runMigration = properties.getBoolean("migration.run", runMigration);
metaTable = properties.get("migration.metaTable", metaTable);
@@ -398,7 +398,7 @@ public class DbMigration {
version = migrationModel.getNextVersion(initialVersion);
}
String fullVersion = version;
String fullVersion = migrationConfig.getApplyPrefix() + version;
if (migrationConfig.getName() != null) {
fullVersion += "__" + toUnderScore(migrationConfig.getName());
@@ -104,6 +104,7 @@ public class MigrationRunner {
break;
}
priorVersion = localVersion;
connection.commit();
}
}
@@ -24,10 +24,12 @@ class MigrationMetaRow {
private String runBy;
private long runTime;
/**
* Construct for inserting into table.
*/
MigrationMetaRow(int id, String type, String version, String comment, int checksum, String runBy, Timestamp runOn) {
MigrationMetaRow(int id, String type, String version, String comment, int checksum, String runBy, Timestamp runOn, long runTime) {
this.id = id;
this.type = type;
this.version = version;
@@ -35,6 +37,7 @@ class MigrationMetaRow {
this.comment = comment;
this.runBy = runBy;
this.runOn = runOn;
this.runTime = runTime;
}
/**
@@ -48,6 +51,7 @@ class MigrationMetaRow {
checksum = row.getInteger("mchecksum");
runOn = row.getTimestamp("run_on");
runBy = row.getString("run_by");
runTime = row.getLong("run_time");
}
public String toString() {
@@ -87,23 +91,7 @@ class MigrationMetaRow {
insert.setParameter(6, checksum);
insert.setParameter(7, runOn);
insert.setParameter(8, runBy);
insert.setParameter(9, "ip");
}
/**
* Bind to an update statement.
*/
public void bindUpdate(int checksum, String runBy, Timestamp runOn, SqlUpdate update) {
this.checksum = checksum;
this.runOn = runOn;
this.runBy = runBy;
update.setParameter(1, checksum);
update.setParameter(2, runOn);
update.setParameter(3, runBy);
update.setParameter(4, "ip");
update.setParameter(5, id);
insert.setParameter(9, runTime);
}
/**
@@ -111,14 +99,8 @@ class MigrationMetaRow {
*/
static String insertSql(String table) {
return "insert into " + table
+ " (id, mtype, mstatus, mversion, mcomment, mchecksum, run_on, run_by, run_ip)"
+ " (id, mtype, mstatus, mversion, mcomment, mchecksum, run_on, run_by, run_time)"
+ " values (?,?,?,?,?,?,?,?,?)";
}
static String updateSql(String table) {
return "update " + table
+ " set mchecksum = ?, run_on = ?, run_by = ?, run_ip = ?"
+ " where id = ?";
}
}
@@ -42,14 +42,12 @@ public class MigrationTable {
private final ServerConfig serverConfig;
private final String envUserName;
private final Timestamp runTime = new Timestamp(System.currentTimeMillis());
private final Timestamp runOn = new Timestamp(System.currentTimeMillis());
private final ScriptTransform scriptTransform;
private final String insertSql;
private final String updateSql;
private final LinkedHashMap<String, MigrationMetaRow> migrations;
private MigrationMetaRow lastMigration;
@@ -65,13 +63,10 @@ public class MigrationTable {
SpiServer pluginApi = server.getPluginApi();
this.serverConfig = pluginApi.getServerConfig();
this.databasePlatform = pluginApi.getDatabasePlatform();
this.catalog = null;
this.schema = null;
this.table = migrationConfig.getMetaTable();
this.insertSql = MigrationMetaRow.insertSql(table);
this.updateSql = MigrationMetaRow.updateSql(table);
this.scriptTransform = createScriptTransform(migrationConfig);
this.envUserName = System.getProperty("user.name");
}
@@ -195,41 +190,35 @@ public class MigrationTable {
}
}
runMigration(local, existing, script, checksum);
runMigration(local, script, checksum);
return true;
}
/**
* Run a migration script as new migration or update on existing repeatable migration.
*/
private void runMigration(LocalMigrationResource local, MigrationMetaRow existing, String script, int checksum) throws SQLException {
private void runMigration(LocalMigrationResource local, String script, int checksum) throws SQLException {
logger.debug("run migration {}", local.getLocation());
long start = System.currentTimeMillis();
MigrationScriptRunner run = new MigrationScriptRunner(connection);
run.runScript(false, script, "run migration version: " + local.getVersion());
if (existing != null) {
// update existing migration row
SqlUpdate update = server.createSqlUpdate(updateSql);
existing.bindUpdate(checksum, envUserName, runTime, update);
server.execute(update, new ExternalJdbcTransaction(connection));
long exeMillis = System.currentTimeMillis() - start;
// insert new migration row
SqlUpdate insert = server.createSqlUpdate(insertSql);
MigrationMetaRow metaRow = createMetaRow(local, checksum, exeMillis);
metaRow.bindInsert(insert);
server.execute(insert, new ExternalJdbcTransaction(connection));
} else {
// insert new migration row
SqlUpdate insert = server.createSqlUpdate(insertSql);
MigrationMetaRow metaRow = createMetaRow(local, checksum);
metaRow.bindInsert(insert);
server.execute(insert, new ExternalJdbcTransaction(connection));
addMigration(local.key(), metaRow);
}
addMigration(local.key(), metaRow);
}
/**
* Create the MigrationMetaRow for this migration.
*/
private MigrationMetaRow createMetaRow(LocalMigrationResource migration, int checksum) {
private MigrationMetaRow createMetaRow(LocalMigrationResource migration, int checksum, long exeMillis) {
int nextId = 1;
if (lastMigration != null) {
@@ -240,7 +229,7 @@ public class MigrationTable {
String runVersion = migration.key();
String comment = migration.getComment();
return new MigrationMetaRow(nextId, type, runVersion, comment, checksum, envUserName, runTime);
return new MigrationMetaRow(nextId, type, runVersion, comment, checksum, envUserName, runOn, exeMillis);
}
/**