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}