From e2b412aa5a26a5fabf2a080f82a17a1991ff4b82 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Mon, 3 Jan 2022 16:58:14 +0100 Subject: [PATCH] DbMigration is also a plugin now --- .../dbmigration/DbMigrationPlugin.java | 20 ++++- .../dbmigration/DefaultDbMigration.java | 15 ++-- .../META-INF/services/io.ebean.plugin.Plugin | 3 - .../dbmigration/DbMigrationGenerateTest.java | 89 ++++++------------- 4 files changed, 55 insertions(+), 72 deletions(-) diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DbMigrationPlugin.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DbMigrationPlugin.java index cdb5b2ec5..8da7571e2 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DbMigrationPlugin.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DbMigrationPlugin.java @@ -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; + } } diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java index 7dec22967..2b8345a16 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java @@ -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); } } diff --git a/ebean-ddl-generator/src/main/resources/META-INF/services/io.ebean.plugin.Plugin b/ebean-ddl-generator/src/main/resources/META-INF/services/io.ebean.plugin.Plugin index fb69c3435..8a340c377 100644 --- a/ebean-ddl-generator/src/main/resources/META-INF/services/io.ebean.plugin.Plugin +++ b/ebean-ddl-generator/src/main/resources/META-INF/services/io.ebean.plugin.Plugin @@ -1,5 +1,2 @@ -<<<<<<< HEAD io.ebeaninternal.dbmigration.DdlPlugin -======= io.ebeaninternal.dbmigration.DbMigrationPlugin ->>>>>>> DbMigrationPlugin diff --git a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java index cdfc3df13..d207cc987 100644 --- a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java +++ b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java @@ -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"); }