mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
DbMigration is also a plugin now
This commit is contained in:
+18
-2
@@ -2,6 +2,7 @@ package io.ebeaninternal.dbmigration;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import io.ebean.config.DatabaseConfig;
|
||||
import io.ebean.plugin.Plugin;
|
||||
import io.ebean.plugin.SpiServer;
|
||||
|
||||
@@ -9,6 +10,9 @@ public class DbMigrationPlugin implements Plugin {
|
||||
|
||||
private DefaultDbMigration dbMigration;
|
||||
|
||||
private static String lastMigration;
|
||||
private static String lastInit;
|
||||
|
||||
@Override
|
||||
public void configure(SpiServer server) {
|
||||
dbMigration = new DefaultDbMigration();
|
||||
@@ -18,11 +22,16 @@ public class DbMigrationPlugin implements Plugin {
|
||||
@Override
|
||||
public void online(boolean online) {
|
||||
try {
|
||||
lastInit = null;
|
||||
lastMigration = null;
|
||||
if (dbMigration.generate) {
|
||||
dbMigration.generateMigration();
|
||||
String tmp = lastMigration = dbMigration.generateMigration();
|
||||
if (tmp == null) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (dbMigration.generateInit) {
|
||||
dbMigration.generateInitMigration();
|
||||
lastInit = dbMigration.generateInitMigration();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Error while generating migration");
|
||||
@@ -34,4 +43,11 @@ public class DbMigrationPlugin implements Plugin {
|
||||
dbMigration = null;
|
||||
}
|
||||
|
||||
public static String getLastInit() {
|
||||
return lastInit;
|
||||
}
|
||||
|
||||
public static String getLastMigration() {
|
||||
return lastMigration;
|
||||
}
|
||||
}
|
||||
|
||||
+9
-6
@@ -134,6 +134,7 @@ public class DefaultDbMigration implements DbMigration {
|
||||
protected boolean includeIndex;
|
||||
protected boolean generate = true;
|
||||
protected boolean generateInit = false;
|
||||
private boolean keepLastInit = true;
|
||||
|
||||
/**
|
||||
* Create for offline migration generation.
|
||||
@@ -428,7 +429,7 @@ public class DefaultDbMigration implements DbMigration {
|
||||
for (String pendingDrop : request.getPendingDrops()) {
|
||||
sj.add(generatePendingDrop(request, pendingDrop));
|
||||
}
|
||||
return sj.toString();
|
||||
return sj.length() == 0 ? null : sj.toString();
|
||||
} else if (pendingVersion != null) {
|
||||
return generatePendingDrop(request, pendingVersion);
|
||||
} else {
|
||||
@@ -666,11 +667,8 @@ public class DefaultDbMigration implements DbMigration {
|
||||
logError("migration already exists, not generating DDL");
|
||||
return null;
|
||||
} else {
|
||||
if (request.initMigration) {
|
||||
FIXME: Hier sollten wir dann die vorhandenen löschen
|
||||
}
|
||||
if (!platforms.isEmpty()) {
|
||||
writeExtraPlatformDdl(fullVersion, request.currentModel, dbMigration, request.migrationDir);
|
||||
writeExtraPlatformDdl(fullVersion, request.currentModel, dbMigration, request.migrationDir, request.initMigration && keepLastInit);
|
||||
|
||||
} else if (databasePlatform != null) {
|
||||
// writer needs the current model to provide table/column details for
|
||||
@@ -742,12 +740,17 @@ public class DefaultDbMigration implements DbMigration {
|
||||
/**
|
||||
* Write any extra platform ddl.
|
||||
*/
|
||||
private void writeExtraPlatformDdl(String fullVersion, CurrentModel currentModel, Migration dbMigration, File writePath) throws IOException {
|
||||
private void writeExtraPlatformDdl(String fullVersion, CurrentModel currentModel, Migration dbMigration, File writePath, boolean clear) throws IOException {
|
||||
DdlOptions options = new DdlOptions(addForeignKeySkipCheck);
|
||||
for (Pair pair : platforms) {
|
||||
DdlWrite platformBuffer = new DdlWrite(new MConfiguration(), currentModel.read(), options);
|
||||
PlatformDdlWriter platformWriter = createDdlWriter(pair.platform);
|
||||
File subPath = platformWriter.subPath(writePath, pair.prefix);
|
||||
if (clear) {
|
||||
for (File existing : subPath.listFiles()) {
|
||||
existing.delete();
|
||||
}
|
||||
}
|
||||
platformWriter.processMigration(dbMigration, platformBuffer, subPath, fullVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,2 @@
|
||||
<<<<<<< HEAD
|
||||
io.ebeaninternal.dbmigration.DdlPlugin
|
||||
=======
|
||||
io.ebeaninternal.dbmigration.DbMigrationPlugin
|
||||
>>>>>>> DbMigrationPlugin
|
||||
|
||||
+28
-61
@@ -12,6 +12,7 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@@ -39,26 +40,6 @@ public class DbMigrationGenerateTest {
|
||||
public static void run(String pathToResources) throws IOException {
|
||||
logger.info("start current directory: " + new File(".").getAbsolutePath());
|
||||
|
||||
DefaultDbMigration migration = new DefaultDbMigration();
|
||||
migration.setIncludeIndex(true);
|
||||
// We use src/test/resources as output directory (so we see in GIT if files will change)
|
||||
migration.setPathToResources(pathToResources);
|
||||
migration.setMigrationPath("db/migration");
|
||||
migration.setMigrationPath(null); // use the default for this test
|
||||
|
||||
// migration.addPlatform(Platform.GENERIC, "generic"); there is no ddl handler for generic
|
||||
// migration.addPlatform(Platform.SQLANYWHERE, "sqlanywhere"); and sqlanywhere
|
||||
migration.addPlatform(Platform.DB2);
|
||||
migration.addPlatform(Platform.H2);
|
||||
migration.addPlatform(Platform.HSQLDB, "hsqldb");
|
||||
migration.addPlatform(Platform.MYSQL, "mysql");
|
||||
migration.addPlatform(Platform.MYSQL55, "mysql55");
|
||||
migration.addPlatform(Platform.POSTGRES);
|
||||
migration.addPlatform(Platform.ORACLE);
|
||||
migration.addPlatform(Platform.SQLITE);
|
||||
migration.addPlatform(Platform.SQLSERVER17, "sqlserver17");
|
||||
migration.addPlatform(Platform.HANA);
|
||||
|
||||
DatabaseConfig config = new DatabaseConfig();
|
||||
config.setName("migrationtest");
|
||||
config.loadFromProperties();
|
||||
@@ -67,59 +48,45 @@ public class DbMigrationGenerateTest {
|
||||
config.getProperties().put("ebean.hana.generateUniqueDdl", "true"); // need to generate unique statements to prevent them from being filtered out as duplicates by the DdlRunner
|
||||
|
||||
|
||||
config.getProperties().put("ebean.migrationtest.migration.pathToResources", pathToResources);
|
||||
config.getProperties().put("ebean.migrationtest.migration.includeIndex", "true");
|
||||
config.getProperties().put("ebean.migrationtest.migration.generateInit", "true");
|
||||
config.getProperties().put("ebean.migrationtest.migration.generatePendingDrop", "auto");
|
||||
config.getProperties().put("ebean.migrationtest.migration.platforms", "db2,h2,hsqldb,mysql,mysql55=mysql55,postgres,oracle,sqlite,sqlserver17=sqlserver17,hana");
|
||||
config.setPackages(Arrays.asList("misc.migration.v1_0"));
|
||||
Database server = DatabaseFactory.create(config);
|
||||
migration.setServer(server);
|
||||
|
||||
// First, we clean up the output-directory
|
||||
assertThat(migration.migrationDirectory().getAbsolutePath()).contains("migrationtest");
|
||||
Files.walk(migration.migrationDirectory().toPath())
|
||||
Files.walk(Paths.get(pathToResources, "dbmigration","migrationtest"))
|
||||
.filter(Files::isRegularFile).map(Path::toFile).forEach(File::delete);
|
||||
|
||||
DatabaseFactory.create(config).shutdown();
|
||||
|
||||
// then we generate migration scripts for v1_0
|
||||
assertThat(migration.generateMigration()).isEqualTo("1.0__initial");
|
||||
assertThat(DbMigrationPlugin.getLastMigration()).isEqualTo("1.0__initial");
|
||||
assertThat(DbMigrationPlugin.getLastInit()).isEqualTo("1.0__initial");
|
||||
|
||||
// and we check repeatative calls
|
||||
assertThat(migration.generateMigration()).isNull();
|
||||
|
||||
DatabaseFactory.create(config).shutdown();
|
||||
assertThat(DbMigrationPlugin.getLastMigration()).isNull();
|
||||
assertThat(DbMigrationPlugin.getLastInit()).isNull();
|
||||
|
||||
// and now for v1_1
|
||||
config.setPackages(Arrays.asList("misc.migration.v1_1"));
|
||||
server.shutdown();
|
||||
server = DatabaseFactory.create(config);
|
||||
migration.setServer(server);
|
||||
assertThat(migration.generateMigration()).isEqualTo("1.1");
|
||||
assertThat(migration.generateMigration()).isNull(); // subsequent call
|
||||
DatabaseFactory.create(config).shutdown();
|
||||
assertThat(DbMigrationPlugin.getLastMigration()).isEqualTo("1.1,1.2__dropsFor_1.1");
|
||||
assertThat(DbMigrationPlugin.getLastInit()).isEqualTo("1.2");
|
||||
|
||||
|
||||
|
||||
System.setProperty("ddl.migration.pendingDropsFor", "1.1");
|
||||
assertThat(migration.generateMigration()).isEqualTo("1.2__dropsFor_1.1");
|
||||
|
||||
assertThatThrownBy(()->migration.generateMigration())
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("No 'pendingDrops'"); // subsequent call
|
||||
|
||||
System.clearProperty("ddl.migration.pendingDropsFor");
|
||||
assertThat(migration.generateMigration()).isNull(); // subsequent call
|
||||
|
||||
// and now for v1_2 with
|
||||
// subsequent call
|
||||
DatabaseFactory.create(config).shutdown();
|
||||
assertThat(DbMigrationPlugin.getLastMigration()).isNull();
|
||||
assertThat(DbMigrationPlugin.getLastInit()).isNull();
|
||||
|
||||
// and now for v1_2
|
||||
config.setPackages(Arrays.asList("misc.migration.v1_2"));
|
||||
server.shutdown();
|
||||
server = DatabaseFactory.create(config);
|
||||
migration.setServer(server);
|
||||
assertThat(migration.generateMigration()).isEqualTo("1.3");
|
||||
assertThat(migration.generateMigration()).isNull(); // subsequent call
|
||||
DatabaseFactory.create(config).shutdown();
|
||||
assertThat(DbMigrationPlugin.getLastMigration()).isEqualTo("1.3,1.4__dropsFor_1.3");
|
||||
assertThat(DbMigrationPlugin.getLastInit()).isEqualTo("1.4");
|
||||
|
||||
|
||||
System.setProperty("ddl.migration.pendingDropsFor", "1.3");
|
||||
assertThat(migration.generateMigration()).isEqualTo("1.4__dropsFor_1.3");
|
||||
assertThatThrownBy(migration::generateMigration)
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("No 'pendingDrops'"); // subsequent call
|
||||
|
||||
System.clearProperty("ddl.migration.pendingDropsFor");
|
||||
assertThat(migration.generateMigration()).isNull(); // subsequent call
|
||||
|
||||
server.shutdown();
|
||||
logger.info("end");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user