001package io.ebeaninternal.dbmigration.ddlgeneration.platform;
002
003import io.ebean.config.dbplatform.h2.H2HistoryTrigger;
004import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer;
005import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite;
006import io.ebeaninternal.dbmigration.model.MTable;
007
008import java.io.IOException;
009
010/**
011 * H2 history support using DB triggers to maintain a history table.
012 */
013public class H2HistoryDdl extends DbTriggerBasedHistoryDdl {
014
015  private static final String TRIGGER_CLASS = H2HistoryTrigger.class.getName();
016
017  H2HistoryDdl() {
018    this.sysPeriodType = "timestamp";
019    this.now = "now()";
020    this.sysPeriodEndValue = "now()";
021  }
022
023  @Override
024  protected void dropTriggers(DdlBuffer buffer, String baseTable) throws IOException {
025
026    buffer.append("drop trigger ").append(updateTriggerName(baseTable)).endOfStatement();
027  }
028
029  @Override
030  protected void createTriggers(DdlWrite writer, MTable table) throws IOException {
031
032    String baseTableName = table.getName();
033    DdlBuffer apply = writer.applyHistoryTrigger();
034
035    addCreateTrigger(apply, updateTriggerName(baseTableName), baseTableName);
036  }
037
038  @Override
039  protected void updateHistoryTriggers(DbTriggerUpdate update) throws IOException {
040
041    recreateHistoryView(update);
042
043    DdlBuffer buffer = update.historyTriggerBuffer();
044    dropTriggers(buffer, update.getBaseTable());
045    addCreateTrigger(buffer, updateTriggerName(update.getBaseTable()), update.getBaseTable());
046  }
047
048  private void addCreateTrigger(DdlBuffer apply, String triggerName, String baseTable) throws IOException {
049
050    // Note that this does not take into account the historyTable name (excepts _history suffix) and
051    // does not take into account excluded columns (all columns included in history)
052    apply
053      .append("create trigger ").append(triggerName).append(" before update,delete on ").append(baseTable)
054      .append(" for each row call \"" + TRIGGER_CLASS + "\";").newLine();
055  }
056
057}