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