From 5e5283d8d302a91827494ce99f775665a7fc1fdb Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Mon, 3 Jan 2022 10:20:21 +0100 Subject: [PATCH] Intermediate commit --- .../dbmigration/DbMigrationPlugin.java | 37 +++++++++++++++++++ .../dbmigration/DefaultDbMigration.java | 21 ++++++++++- .../META-INF/services/io.ebean.plugin.Plugin | 1 + .../EbeanServerFactory_MultiTenancy_Test.java | 33 +++++++++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DbMigrationPlugin.java create mode 100644 ebean-ddl-generator/src/main/resources/META-INF/services/io.ebean.plugin.Plugin 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 new file mode 100644 index 000000000..cdb5b2ec5 --- /dev/null +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/DbMigrationPlugin.java @@ -0,0 +1,37 @@ +package io.ebeaninternal.dbmigration; + +import java.io.IOException; + +import io.ebean.plugin.Plugin; +import io.ebean.plugin.SpiServer; + +public class DbMigrationPlugin implements Plugin { + + private DefaultDbMigration dbMigration; + + @Override + public void configure(SpiServer server) { + dbMigration = new DefaultDbMigration(); + dbMigration.setServer(server); + } + + @Override + public void online(boolean online) { + try { + if (dbMigration.generate) { + dbMigration.generateMigration(); + } + if (dbMigration.generateInit) { + dbMigration.generateInitMigration(); + } + } catch (IOException e) { + throw new RuntimeException("Error while generating migration"); + } + } + + @Override + public void shutdown() { + dbMigration = null; + } + +} 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 77fc67320..7dec22967 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 @@ -71,6 +71,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; +import java.util.StringJoiner; import javax.persistence.EnumType; @@ -131,6 +132,8 @@ public class DefaultDbMigration implements DbMigration { private int lockTimeoutSeconds; protected boolean includeBuiltInPartitioning = true; protected boolean includeIndex; + protected boolean generate = true; + protected boolean generateInit = false; /** * Create for offline migration generation. @@ -187,6 +190,8 @@ public class DefaultDbMigration implements DbMigration { online = props.getBoolean("migration.online", online); vanillaPlatform = props.getBoolean("migration.vanillaPlatform", vanillaPlatform); version = props.get("migration.version", version); + generate = props.getBoolean("migration.generate", generate); + generateInit = props.getBoolean("migration.generateInit", generateInit); // header & strictMode must be configured at DatabaseConfig level parsePlatforms(props.get("migration.platforms"), config.getClassLoadConfig()); } @@ -413,7 +418,18 @@ public class DefaultDbMigration implements DbMigration { } String pendingVersion = generatePendingDrop(); - if (pendingVersion != null) { + if ("auto".equals(pendingVersion)) { + StringJoiner sj = new StringJoiner(","); + String diff = generateDiff(request); + if (diff != null) { + sj.add(diff); + request = createRequest(initMigration); + } + for (String pendingDrop : request.getPendingDrops()) { + sj.add(generatePendingDrop(request, pendingDrop)); + } + return sj.toString(); + } else if (pendingVersion != null) { return generatePendingDrop(request, pendingVersion); } else { return generateDiff(request); @@ -650,6 +666,9 @@ 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); 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 new file mode 100644 index 000000000..83ec94df4 --- /dev/null +++ b/ebean-ddl-generator/src/main/resources/META-INF/services/io.ebean.plugin.Plugin @@ -0,0 +1 @@ +io.ebeaninternal.dbmigration.DbMigrationPlugin diff --git a/ebean-test/src/test/java/io/ebean/EbeanServerFactory_MultiTenancy_Test.java b/ebean-test/src/test/java/io/ebean/EbeanServerFactory_MultiTenancy_Test.java index 00f395f36..a2411871b 100644 --- a/ebean-test/src/test/java/io/ebean/EbeanServerFactory_MultiTenancy_Test.java +++ b/ebean-test/src/test/java/io/ebean/EbeanServerFactory_MultiTenancy_Test.java @@ -46,6 +46,39 @@ public class EbeanServerFactory_MultiTenancy_Test extends BaseTestCase { + /** + * Tests using multi tenancy per database + */ + @Test + public void create_new_server_with_multi_tenancy_db_with_master() { + + String tenant = "customer"; + CurrentTenantProvider tenantProvider = Mockito.mock(CurrentTenantProvider.class); + Mockito.doReturn(tenant).when(tenantProvider).currentId(); + + TenantDataSourceProvider dataSourceProvider = Mockito.mock(TenantDataSourceProvider.class); + + DatabaseConfig config = new DatabaseConfig(); + + config.setName("h2"); + config.loadFromProperties(); + config.setRegister(false); + config.setDefaultServer(false); + config.setDdlGenerate(false); + config.setDdlRun(false); + + config.setTenantMode(TenantMode.DB_WITH_MASTER); + config.setCurrentTenantProvider(tenantProvider); + config.setTenantDataSourceProvider(dataSourceProvider); + + Mockito.doReturn(config.getDataSource()).when(dataSourceProvider).dataSource(tenant); + + config.setDatabasePlatform(new PostgresPlatform()); + + final Database database = DatabaseFactory.create(config); + database.shutdown(); + } + /** * Tests using multi tenancy per schema */