Migration is a plugin now

This commit is contained in:
Roland Praml
2022-01-04 10:21:48 +01:00
parent a0d56529a1
commit f045d5e1b0
7 changed files with 36 additions and 475 deletions
+1 -72
View File
@@ -13,13 +13,6 @@
<dependencies>
<!-- <dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-runner</artifactId>
<version>1.2</version>
</dependency> -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration-auto</artifactId>
@@ -38,74 +31,10 @@
<artifactId>ebean-migration</artifactId>
<version>12.12.1</version>
</dependency>
<!--
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>12.12.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>12.14.1-FOC1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
needed for java 11+
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
<scope>provided</scope>
</dependency>
test dependencies
<dependency>
<groupId>io.avaje</groupId>
<artifactId>junit</artifactId>
<version>1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-datasource</artifactId>
<version>${ebean-datasource.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
<scope>test</scope>
</dependency> -->
</dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.ebean</groupId>
<artifactId>ebean-maven-plugin</artifactId>
<version>${ebean-maven-plugin.version}</version>
<executions>
<execution>
<id>test</id>
<phase>process-test-classes</phase>
<configuration>
<transformArgs>debug=0</transformArgs>
</configuration>
<goals>
<goal>testEnhance</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
@@ -43,6 +43,8 @@ public class DbRunMigrationPlugin implements Plugin {
@Override
public void start() {
migrationRunner.run(server.dataSource());
if (migrationRunner != null) {
migrationRunner.run(server.dataSource());
}
}
}
@@ -0,0 +1,11 @@
open module io.ebean.dbmigration.runner {
provides io.ebean.plugin.Plugin with io.ebeaninternal.dbmigration.run.DbRunMigrationPlugin;
requires transitive io.ebean.ddl.runner;
requires transitive io.ebean.core;
requires transitive java.xml.bind;
requires io.ebean.core.type;
requires io.ebean.migration;
}
@@ -2,10 +2,13 @@ package io.ebeaninternal.dbmigration;
import java.io.IOException;
import io.ebean.config.DatabaseConfig;
import io.ebean.plugin.Plugin;
import io.ebean.plugin.SpiServer;
/**
* Plugin to generate db-migration scripts automatically.
* @author Roland Praml, FOCONIS AG
*/
public class DbMigrationPlugin implements Plugin {
private DefaultDbMigration dbMigration;
@@ -2,8 +2,8 @@ open module io.ebean.ddl.generator {
exports io.ebean.dbmigration;
provides io.ebean.dbmigration.DbMigration with io.ebeaninternal.dbmigration.DefaultDbMigration;
provides io.ebeaninternal.api.SpiDdlGeneratorProvider with io.ebeaninternal.dbmigration.DdlGeneratorProvider;
provides io.ebean.plugin.Plugin with io.ebeaninternal.dbmigration.DbMigrationPlugin;
provides io.ebean.plugin.Plugin with io.ebeaninternal.dbmigration.DdlPlugin;
requires transitive io.ebean.ddl.runner;
requires transitive io.ebean.core;
@@ -6,6 +6,7 @@ import io.ebean.config.DatabaseConfig;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -31,15 +32,17 @@ public class MysqlGenerateMigrationTest {
config.loadFromProperties();
config.setRegister(false);
config.setDefaultServer(false);
config.getPlatformConfig().setUseMigrationStoredProcedures(true);
config.setRunMigration(false);
config.getProperties().put("ebean.migrationtest.migration.pathToResources", pathToResources);
config.getProperties().put("ebean.migrationtest.useMigrationStoredProcedures", true);
config.getProperties().put("ebean.migrationtest.migration.platforms", "mysql");
config.getProperties().put("ebean.migrationtest.migration.migrationPath", "dbmigration/migrationtest-procedures/");
config.setPackages(Arrays.asList("misc.migration.v1_0"));
config.setPackages(Arrays.asList("misc.migration.mysql_v1_0"));
// First, we clean up the output-directory
// Files.walk(Paths.get(pathToResources , "dbmigration","migrationtest-procedures"))
// .filter(Files::isRegularFile).map(Path::toFile).forEach(File::delete);
Path path = Paths.get(pathToResources , "dbmigration","migrationtest-procedures");
Files.walk(path)
.filter(Files::isRegularFile).map(Path::toFile).forEach(File::delete);
DatabaseFactory.create(config).shutdown();
@@ -47,75 +50,18 @@ public class MysqlGenerateMigrationTest {
assertThat(DbMigrationPlugin.getLastMigration()).isEqualTo("1.0__initial");
assertThat(DbMigrationPlugin.getLastInit()).isEqualTo("1.0__initial");
// and we check repeatative calls
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"));
config.setPackages(Arrays.asList("misc.migration.mysql_v1_1"));
DatabaseFactory.create(config).shutdown();
assertThat(DbMigrationPlugin.getLastMigration()).isEqualTo("1.1,1.2__dropsFor_1.1");
assertThat(DbMigrationPlugin.getLastInit()).isEqualTo("1.2");
final Path sqlFile = path.resolve("mysql/1.2__dropsFor_1.1.sql");
// // 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"));
// DatabaseFactory.create(config).shutdown();
// assertThat(DbMigrationPlugin.getLastMigration()).isEqualTo("1.3,1.4__dropsFor_1.3");
// assertThat(DbMigrationPlugin.getLastInit()).isEqualTo("1.4");
//
//
// 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("src/test/resources");
//
// migration.addPlatform(Platform.MYSQL, "mysql");
//
// final PlatformConfig platformConfig = new PlatformConfig();
// platformConfig.setUseMigrationStoredProcedures(true);
//
// DatabaseConfig config = new DatabaseConfig();
// config.setName("migrationtest");
// config.loadFromProperties();
// config.setPlatformConfig(platformConfig);
// config.setRegister(false);
// config.setDefaultServer(false);
// config.getProperties().put("ebean.migration.migrationPath", "db/migration/mysql");
//
// config.setPackages(Arrays.asList("misc.migration.mysql_v1_0"));
// Database server = DatabaseFactory.create(config);
// migration.setServer(server);
// migration.setMigrationPath("mysql/procedures");
//
// // First, we clean up the output-directory
// assertThat(migration.migrationDirectory().getAbsolutePath()).contains("procedures");
// Files.walk(migration.migrationDirectory().toPath())
// .filter(Files::isRegularFile)
// .map(Path::toFile).forEach(File::delete);
//
// // then we generate migration scripts for v1_0
// assertThat(migration.generateMigration()).isEqualTo("1.0__initial");
//
// config.setPackages(Arrays.asList("misc.migration.mysql_v1_1"));
// server.shutdown();
// server = DatabaseFactory.create(config);
// migration.setServer(server);
// migration.setMigrationPath("mysql/procedures");
// assertThat(migration.generateMigration()).isEqualTo("1.1,1.2__dropsFor_1.1");
//
// final Path sqlFile = migration.migrationDirectory().toPath()
// .resolve("mysql/1.2__dropsFor_1.1.sql");
//
// assertThat(sqlFile).isNotEmptyFile();
// assertThat(Files.readAllLines(sqlFile, StandardCharsets.UTF_8))
// .contains("CALL usp_ebean_drop_column('migtest_e_basic', 'status2');")
// .contains("CALL usp_ebean_drop_column('migtest_e_basic', 'description');");
assertThat(sqlFile).isNotEmptyFile();
assertThat(Files.readAllLines(sqlFile, StandardCharsets.UTF_8))
.contains("CALL usp_ebean_drop_column('migtest_e_basic', 'status2');")
.contains("CALL usp_ebean_drop_column('migtest_e_basic', 'description');");
}
}
@@ -1,339 +1,9 @@
-- Migrationscripts for ebean unittest
-- apply changes
create table migtest_ckey_assoc (
id integer auto_increment not null,
assoc_one varchar(255),
constraint pk_migtest_ckey_assoc primary key (id)
);
create table migtest_ckey_detail (
id integer auto_increment not null,
something varchar(255),
one_key integer,
two_key varchar(127),
constraint pk_migtest_ckey_detail primary key (id)
);
create table migtest_ckey_parent (
one_key integer not null,
two_key varchar(127) not null,
name varchar(255),
assoc_id integer,
version integer not null,
constraint pk_migtest_ckey_parent primary key (one_key,two_key)
);
create table migtest_fk_cascade (
id bigint auto_increment not null,
one_id bigint,
constraint pk_migtest_fk_cascade primary key (id)
);
create table migtest_fk_cascade_one (
id bigint auto_increment not null,
constraint pk_migtest_fk_cascade_one primary key (id)
);
create table migtest_fk_none (
id bigint auto_increment not null,
one_id bigint,
constraint pk_migtest_fk_none primary key (id)
);
create table migtest_fk_none_via_join (
id bigint auto_increment not null,
one_id bigint,
constraint pk_migtest_fk_none_via_join primary key (id)
);
create table migtest_fk_one (
id bigint auto_increment not null,
constraint pk_migtest_fk_one primary key (id)
);
create table migtest_fk_set_null (
id bigint auto_increment not null,
one_id bigint,
constraint pk_migtest_fk_set_null primary key (id)
);
create table migtest_e_basic (
id integer auto_increment not null,
status varchar(1) default 'A' not null,
status2 varchar(127),
status varchar(1),
name varchar(127),
description varchar(127),
some_date datetime(6),
new_string_field varchar(255) default 'foo''bar' not null,
new_boolean_field tinyint(1) default 1 not null,
new_boolean_field2 tinyint(1) default 1 not null,
indextest1 varchar(127),
indextest2 varchar(127),
indextest3 varchar(127),
indextest4 varchar(127),
indextest5 varchar(127),
indextest6 varchar(127),
progress integer default 0 not null,
new_integer integer default 42 not null,
user_id integer,
constraint uq_migtest_e_basic_description unique (description),
constraint uq_migtest_e_basic_status_indextest1 unique (status,indextest1),
constraint uq_migtest_e_basic_name unique (name),
constraint uq_migtest_e_basic_indextest4 unique (indextest4),
constraint uq_migtest_e_basic_indextest5 unique (indextest5),
constraint pk_migtest_e_basic primary key (id)
);
create table migtest_e_enum (
id integer auto_increment not null,
test_status varchar(1),
constraint pk_migtest_e_enum primary key (id)
);
create table migtest_e_history (
id integer auto_increment not null,
test_string bigint comment 'Column altered to long now',
constraint pk_migtest_e_history primary key (id)
) comment='We have history now';
create table migtest_e_history2 (
id integer auto_increment not null,
test_string varchar(255) default 'unknown' not null,
test_string2 varchar(255),
test_string3 varchar(255) default 'unknown' not null,
new_column varchar(20),
constraint pk_migtest_e_history2 primary key (id)
);
create table migtest_e_history3 (
id integer auto_increment not null,
test_string varchar(255),
constraint pk_migtest_e_history3 primary key (id)
);
create table migtest_e_history4 (
id integer auto_increment not null,
test_number bigint,
constraint pk_migtest_e_history4 primary key (id)
);
create table migtest_e_history5 (
id integer auto_increment not null,
test_number integer,
test_boolean tinyint(1) default 0 not null,
constraint pk_migtest_e_history5 primary key (id)
);
create table migtest_e_history6 (
id integer auto_increment not null,
test_number1 integer default 42 not null,
test_number2 integer,
constraint pk_migtest_e_history6 primary key (id)
);
create table migtest_e_softdelete (
id integer auto_increment not null,
test_string varchar(255),
deleted tinyint(1) default 0 not null,
constraint pk_migtest_e_softdelete primary key (id)
);
create table migtest_e_user (
id integer auto_increment not null,
constraint pk_migtest_e_user primary key (id)
);
create table migtest_mtm_c (
id integer auto_increment not null,
name varchar(255),
constraint pk_migtest_mtm_c primary key (id)
);
create table migtest_mtm_c_migtest_mtm_m (
migtest_mtm_c_id integer not null,
migtest_mtm_m_id bigint not null,
constraint pk_migtest_mtm_c_migtest_mtm_m primary key (migtest_mtm_c_id,migtest_mtm_m_id)
);
create table migtest_mtm_m (
id bigint auto_increment not null,
name varchar(255),
constraint pk_migtest_mtm_m primary key (id)
);
create table migtest_mtm_m_migtest_mtm_c (
migtest_mtm_m_id bigint not null,
migtest_mtm_c_id integer not null,
constraint pk_migtest_mtm_m_migtest_mtm_c primary key (migtest_mtm_m_id,migtest_mtm_c_id)
);
create table migtest_oto_child (
id integer auto_increment not null,
name varchar(255),
master_id bigint,
constraint uq_migtest_oto_child_master_id unique (master_id),
constraint pk_migtest_oto_child primary key (id)
);
create table migtest_oto_master (
id bigint auto_increment not null,
name varchar(255),
constraint pk_migtest_oto_master primary key (id)
);
create index ix_migtest_e_basic_indextest3 on migtest_e_basic (indextest3);
create index ix_migtest_e_basic_indextest6 on migtest_e_basic (indextest6);
create index ix_migtest_ckey_detail_parent on migtest_ckey_detail (one_key,two_key);
alter table migtest_ckey_detail add constraint fk_migtest_ckey_detail_parent foreign key (one_key,two_key) references migtest_ckey_parent (one_key,two_key) on delete restrict on update restrict;
create index ix_migtest_ckey_parent_assoc_id on migtest_ckey_parent (assoc_id);
alter table migtest_ckey_parent add constraint fk_migtest_ckey_parent_assoc_id foreign key (assoc_id) references migtest_ckey_assoc (id) on delete restrict on update restrict;
create index ix_migtest_fk_cascade_one_id on migtest_fk_cascade (one_id);
alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete restrict on update restrict;
create index ix_migtest_fk_none_one_id on migtest_fk_none (one_id);
alter table migtest_fk_none add constraint fk_migtest_fk_none_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict;
create index ix_migtest_fk_none_via_join_one_id on migtest_fk_none_via_join (one_id);
alter table migtest_fk_none_via_join add constraint fk_migtest_fk_none_via_join_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict;
create index ix_migtest_fk_set_null_one_id on migtest_fk_set_null (one_id);
alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict;
create index ix_migtest_e_basic_user_id on migtest_e_basic (user_id);
alter table migtest_e_basic add constraint fk_migtest_e_basic_user_id foreign key (user_id) references migtest_e_user (id) on delete restrict on update restrict;
create index ix_migtest_mtm_c_migtest_mtm_m_migtest_mtm_c on migtest_mtm_c_migtest_mtm_m (migtest_mtm_c_id);
alter table migtest_mtm_c_migtest_mtm_m add constraint fk_migtest_mtm_c_migtest_mtm_m_migtest_mtm_c foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict on update restrict;
create index ix_migtest_mtm_c_migtest_mtm_m_migtest_mtm_m on migtest_mtm_c_migtest_mtm_m (migtest_mtm_m_id);
alter table migtest_mtm_c_migtest_mtm_m add constraint fk_migtest_mtm_c_migtest_mtm_m_migtest_mtm_m foreign key (migtest_mtm_m_id) references migtest_mtm_m (id) on delete restrict on update restrict;
create index ix_migtest_mtm_m_migtest_mtm_c_migtest_mtm_m on migtest_mtm_m_migtest_mtm_c (migtest_mtm_m_id);
alter table migtest_mtm_m_migtest_mtm_c add constraint fk_migtest_mtm_m_migtest_mtm_c_migtest_mtm_m foreign key (migtest_mtm_m_id) references migtest_mtm_m (id) on delete restrict on update restrict;
create index ix_migtest_mtm_m_migtest_mtm_c_migtest_mtm_c on migtest_mtm_m_migtest_mtm_c (migtest_mtm_c_id);
alter table migtest_mtm_m_migtest_mtm_c add constraint fk_migtest_mtm_m_migtest_mtm_c_migtest_mtm_c foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict on update restrict;
alter table migtest_oto_child add constraint fk_migtest_oto_child_master_id foreign key (master_id) references migtest_oto_master (id) on delete restrict on update restrict;
alter table migtest_e_history add column sys_period_start datetime(6) default now(6);
alter table migtest_e_history add column sys_period_end datetime(6);
create table migtest_e_history_history(
id integer,
test_string bigint,
sys_period_start datetime(6),
sys_period_end datetime(6)
);
create view migtest_e_history_with_history as select * from migtest_e_history union all select * from migtest_e_history_history;
alter table migtest_e_history2 add column sys_period_start datetime(6) default now(6);
alter table migtest_e_history2 add column sys_period_end datetime(6);
create table migtest_e_history2_history(
id integer,
test_string varchar(255),
test_string2 varchar(255),
test_string3 varchar(255),
new_column varchar(20),
sys_period_start datetime(6),
sys_period_end datetime(6)
);
create view migtest_e_history2_with_history as select * from migtest_e_history2 union all select * from migtest_e_history2_history;
alter table migtest_e_history3 add column sys_period_start datetime(6) default now(6);
alter table migtest_e_history3 add column sys_period_end datetime(6);
create table migtest_e_history3_history(
id integer,
test_string varchar(255),
sys_period_start datetime(6),
sys_period_end datetime(6)
);
create view migtest_e_history3_with_history as select * from migtest_e_history3 union all select * from migtest_e_history3_history;
alter table migtest_e_history4 add column sys_period_start datetime(6) default now(6);
alter table migtest_e_history4 add column sys_period_end datetime(6);
create table migtest_e_history4_history(
id integer,
test_number bigint,
sys_period_start datetime(6),
sys_period_end datetime(6)
);
create view migtest_e_history4_with_history as select * from migtest_e_history4 union all select * from migtest_e_history4_history;
alter table migtest_e_history5 add column sys_period_start datetime(6) default now(6);
alter table migtest_e_history5 add column sys_period_end datetime(6);
create table migtest_e_history5_history(
id integer,
test_number integer,
test_boolean tinyint(1),
sys_period_start datetime(6),
sys_period_end datetime(6)
);
create view migtest_e_history5_with_history as select * from migtest_e_history5 union all select * from migtest_e_history5_history;
alter table migtest_e_history6 add column sys_period_start datetime(6) default now(6);
alter table migtest_e_history6 add column sys_period_end datetime(6);
create table migtest_e_history6_history(
id integer,
test_number1 integer,
test_number2 integer,
sys_period_start datetime(6),
sys_period_end datetime(6)
);
create view migtest_e_history6_with_history as select * from migtest_e_history6 union all select * from migtest_e_history6_history;
delimiter $$
create trigger migtest_e_history_history_upd before update on migtest_e_history for each row begin
insert into migtest_e_history_history (sys_period_start,sys_period_end,id, test_string) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string);
set NEW.sys_period_start = now(6);
end$$
delimiter $$
create trigger migtest_e_history_history_del before delete on migtest_e_history for each row begin
insert into migtest_e_history_history (sys_period_start,sys_period_end,id, test_string) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string);
end$$
delimiter $$
create trigger migtest_e_history2_history_upd before update on migtest_e_history2 for each row begin
insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, test_string3, new_column) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.test_string3, OLD.new_column);
set NEW.sys_period_start = now(6);
end$$
delimiter $$
create trigger migtest_e_history2_history_del before delete on migtest_e_history2 for each row begin
insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, test_string3, new_column) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.test_string3, OLD.new_column);
end$$
delimiter $$
create trigger migtest_e_history3_history_upd before update on migtest_e_history3 for each row begin
insert into migtest_e_history3_history (sys_period_start,sys_period_end,id) values (OLD.sys_period_start, now(6),OLD.id);
set NEW.sys_period_start = now(6);
end$$
delimiter $$
create trigger migtest_e_history3_history_del before delete on migtest_e_history3 for each row begin
insert into migtest_e_history3_history (sys_period_start,sys_period_end,id) values (OLD.sys_period_start, now(6),OLD.id);
end$$
delimiter $$
create trigger migtest_e_history4_history_upd before update on migtest_e_history4 for each row begin
insert into migtest_e_history4_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
set NEW.sys_period_start = now(6);
end$$
delimiter $$
create trigger migtest_e_history4_history_del before delete on migtest_e_history4 for each row begin
insert into migtest_e_history4_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
end$$
delimiter $$
create trigger migtest_e_history5_history_upd before update on migtest_e_history5 for each row begin
insert into migtest_e_history5_history (sys_period_start,sys_period_end,id, test_number, test_boolean) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number, OLD.test_boolean);
set NEW.sys_period_start = now(6);
end$$
delimiter $$
create trigger migtest_e_history5_history_del before delete on migtest_e_history5 for each row begin
insert into migtest_e_history5_history (sys_period_start,sys_period_end,id, test_number, test_boolean) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number, OLD.test_boolean);
end$$
delimiter $$
create trigger migtest_e_history6_history_upd before update on migtest_e_history6 for each row begin
insert into migtest_e_history6_history (sys_period_start,sys_period_end,id, test_number1, test_number2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number1, OLD.test_number2);
set NEW.sys_period_start = now(6);
end$$
delimiter $$
create trigger migtest_e_history6_history_del before delete on migtest_e_history6 for each row begin
insert into migtest_e_history6_history (sys_period_start,sys_period_end,id, test_number1, test_number2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number1, OLD.test_number2);
end$$