Files
ebean/src/main/java/io/ebeaninternal/dbmigration/model/CurrentModel.java
T
Roland PramlandRob Bygrave 41a31c1aa0 trigger based history will recreate view properly and handle default … (#1370)
* trigger based history will recreate view properly and handle default value also for history view

* HistoryTriggers are generated at the end

* Reference Script

* MYSQL: lock all tables at once
2018-05-20 17:19:10 +12:00

177 lines
4.9 KiB
Java

package io.ebeaninternal.dbmigration.model;
import io.ebean.config.DbConstraintNaming;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlHandler;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.DefaultConstraintMaxLength;
import io.ebeaninternal.dbmigration.migration.ChangeSet;
import io.ebeaninternal.dbmigration.model.build.ModelBuildBeanVisitor;
import io.ebeaninternal.dbmigration.model.build.ModelBuildContext;
import io.ebeaninternal.dbmigration.model.visitor.VisitAllUsing;
import java.io.IOException;
/**
* Reads EbeanServer bean descriptors to build the current model.
*/
public class CurrentModel {
private final SpiEbeanServer server;
private final DbConstraintNaming constraintNaming;
private final DbConstraintNaming.MaxLength maxLength;
private final boolean platformTypes;
private ModelContainer model;
private ChangeSet changeSet;
private DdlWrite write;
/**
* Construct with a given EbeanServer instance for DDL create all generation, not migration.
*/
public CurrentModel(SpiEbeanServer server) {
this(server, server.getServerConfig().getConstraintNaming(), true);
}
/**
* Construct with a given EbeanServer, platformDdl and constraintNaming convention.
* <p>
* Note the EbeanServer is just used to read the BeanDescriptors and platformDdl supplies
* the platform specific handling on
* </p>
*/
public CurrentModel(SpiEbeanServer server, DbConstraintNaming constraintNaming) {
this(server, constraintNaming, false);
}
private CurrentModel(SpiEbeanServer server, DbConstraintNaming constraintNaming, boolean platformTypes) {
this.server = server;
this.constraintNaming = constraintNaming;
this.maxLength = maxLength(server, constraintNaming);
this.platformTypes = platformTypes;
}
private static DbConstraintNaming.MaxLength maxLength(SpiEbeanServer server, DbConstraintNaming naming) {
if (naming.getMaxLength() != null) {
return naming.getMaxLength();
}
int maxConstraintNameLength = server.getDatabasePlatform().getMaxConstraintNameLength();
return new DefaultConstraintMaxLength(maxConstraintNameLength);
}
/**
* Return the current model by reading all the bean descriptors and properties.
*/
public ModelContainer read() {
if (model == null) {
model = new ModelContainer();
ModelBuildContext context = new ModelBuildContext(model, constraintNaming, maxLength, platformTypes);
ModelBuildBeanVisitor visitor = new ModelBuildBeanVisitor(context);
VisitAllUsing visit = new VisitAllUsing(visitor, server);
visit.visitAllBeans();
// adjust the foreign keys on the 'draft' tables
context.adjustDraftReferences();
}
return model;
}
public void setChangeSet(ChangeSet changeSet) {
this.changeSet = changeSet;
}
/**
* Return as a ChangeSet.
*/
public ChangeSet getChangeSet() {
read();
if (changeSet == null) {
changeSet = asChangeSet();
}
return changeSet;
}
/**
* Return the 'Create' DDL.
*/
public String getCreateDdl() throws IOException {
createDdl();
StringBuilder ddl = new StringBuilder(2000);
String header = server.getServerConfig().getMigrationConfig().getDdlHeader();
if (header != null && !header.isEmpty()) {
ddl.append(header).append('\n');
}
ddl.append(write.apply().getBuffer());
ddl.append(write.applyForeignKeys().getBuffer());
ddl.append(write.applyHistoryView().getBuffer());
ddl.append(write.applyHistoryTrigger().getBuffer());
return ddl.toString();
}
/**
* Return the 'Drop' DDL.
*/
public String getDropAllDdl() throws IOException {
createDdl();
StringBuilder ddl = new StringBuilder(2000);
String header = server.getServerConfig().getMigrationConfig().getDdlHeader();
if (header != null && !header.isEmpty()) {
ddl.append(header).append('\n');
}
ddl.append(write.dropAllForeignKeys().getBuffer());
ddl.append(write.dropAll().getBuffer());
return ddl.toString();
}
/**
* Create all the DDL based on the changeSet.
*/
private void createDdl() throws IOException {
if (write == null) {
ChangeSet createChangeSet = getChangeSet();
write = new DdlWrite(new MConfiguration(), model);
DdlHandler handler = handler();
handler.generateProlog(write);
handler.generate(write, createChangeSet);
handler.generateEpilog(write);
}
}
/**
* Return the platform specific DdlHandler (to generate DDL).
*/
private DdlHandler handler() {
return server.createDdlHandler();
}
/**
* Convert the model into a ChangeSet.
*/
private ChangeSet asChangeSet() {
// empty diff so changes will effectively all be create
ModelDiff diff = new ModelDiff();
diff.compareTo(model);
return diff.getApplyChangeSet();
}
}