#636 - ENH: Add DB Migration runner (as alternative to running via FlywayDB etc)

This commit is contained in:
Robin Bygrave
2016-04-22 16:19:09 +12:00
parent 8f93f780fd
commit b79bb892f7
4 changed files with 33 additions and 8 deletions
@@ -366,8 +366,8 @@ public class DbMigrationConfig {
metaTable = properties.get("migration.metaTable", metaTable);
runPlaceholders = properties.get("migration.placeholders", runPlaceholders);
String adminUser = properties.get("datasource."+serverName+".user", dbUser);
adminUser = properties.get("datasource."+serverName+".adminuser", adminUser);
String adminUser = properties.get("datasource."+serverName+".username", dbUser);
adminUser = properties.get("datasource."+serverName+".adminusername", adminUser);
dbUser = properties.get("migration.dbuser", adminUser);
String adminPwd = properties.get("datasource."+serverName+".password", dbPassword);
@@ -21,7 +21,7 @@ import java.util.List;
*/
public class MigrationRunner {
private static final Logger logger = LoggerFactory.getLogger(MigrationRunner.class);
public static final Logger logger = LoggerFactory.getLogger("org.avaje.ebean.DbMigration");
private final EbeanServer server;
@@ -48,8 +48,16 @@ public class MigrationRunner {
String migrationUser = migrationConfig.getDbUser();
String migrationPwd = migrationConfig.getDbPassword();
if (migrationUser == null) {
throw new IllegalStateException("No DB migration user specified (to run the db migration) ?");
}
DataSource dataSource = server.getPluginApi().getDataSource();
if (dataSource == null) {
throw new IllegalStateException("No dataSource when trying to run migration? "
+"Maybe trying to generate DBMigration when ebean.migration.run=true is set? "
+"Perhaps need to set ebean.migration.run=false in test-ebean.properties?");
}
Connection connection;
try {
@@ -59,8 +67,8 @@ public class MigrationRunner {
}
try {
logger.debug("using db user [{}] to run migrations ...");
connection.setAutoCommit(false);
runMigrations(resources, connection);
connection.commit();
@@ -85,6 +93,8 @@ public class MigrationRunner {
// get the migrations in version order
List<LocalMigrationResource> localVersions = resources.getVersions();
logger.info("local migrations:{} existing migrations:{}", localVersions.size(), table.size());
LocalMigrationResource priorVersion = null;
// run migrations in order
@@ -45,7 +45,7 @@ class MigrationMetaRow {
MigrationMetaRow(SqlRow row) {
id = row.getInteger("id");
status = row.getString("status");
runVersion = row.getString("row_version");
runVersion = row.getString("run_version");
depVersion = row.getString("dep_version");
comment = row.getString("comment");
checksum = row.getInteger("checksum");
@@ -53,6 +53,10 @@ class MigrationMetaRow {
runBy = row.getString("run_by");
}
public String toString() {
return "id:" + id + " status:" + status + " runVersion:" + runVersion + " comment:" + comment + " runOn:" + runOn + " runBy:" + runBy;
}
/**
* Return the id for this migration.
*/
@@ -7,11 +7,11 @@ import com.avaje.ebean.SqlUpdate;
import com.avaje.ebean.config.DbMigrationConfig;
import com.avaje.ebean.config.ServerConfig;
import com.avaje.ebean.config.dbplatform.DatabasePlatform;
import com.avaje.ebean.dbmigration.MigrationRunner;
import com.avaje.ebean.plugin.SpiServer;
import com.avaje.ebeaninternal.server.transaction.ExternalJdbcTransaction;
import com.avaje.ebeaninternal.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.URL;
@@ -27,7 +27,7 @@ import java.util.Map;
*/
public class MigrationTable {
private static final Logger logger = LoggerFactory.getLogger(MigrationTable.class);
private static final Logger logger = MigrationRunner.logger;
private final Connection connection;
@@ -70,6 +70,13 @@ public class MigrationTable {
this.envUserName = System.getProperty("user.name");
}
/**
* Return the number of migrations in the DB migration table.
*/
public int size() {
return migrations.size();
}
/**
* Create the ScriptTransform for placeholder key/value replacement.
*/
@@ -229,6 +236,10 @@ public class MigrationTable {
*/
private void addMigration(MigrationMetaRow metaRow) {
lastMigration = metaRow;
migrations.put(metaRow.getRunVersion(), metaRow);
String runVersion = metaRow.getRunVersion();
if (runVersion == null) {
throw new IllegalStateException("No runVersion in db migration table row? " + metaRow);
}
migrations.put(runVersion, metaRow);
}
}