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}