001package io.ebeaninternal.dbmigration.ddlgeneration.platform; 002 003 004import java.util.List; 005 006import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; 007 008/** 009 * NuoDB history support using DB triggers to maintain a history table. 010 */ 011public class NuoDbHistoryDdl extends DbTriggerBasedHistoryDdl { 012 013 NuoDbHistoryDdl() { 014 this.now = "now()"; 015 this.sysPeriodEndValue = "NEW.sys_period_start"; 016 } 017 018 @Override 019 protected void dropTriggers(DdlBuffer buffer, String baseTable) { 020 021 buffer.append("drop trigger ").append(updateTriggerName(baseTable)).endOfStatement(); 022 buffer.append("drop trigger ").append(deleteTriggerName(baseTable)).endOfStatement(); 023 } 024 025 @Override 026 protected void createTriggers(DdlBuffer buffer, String baseTable, List<String> columnNames) { 027 028 addBeforeUpdate(buffer, updateTriggerName(baseTable), baseTable, columnNames); 029 addBeforeDelete(buffer, deleteTriggerName(baseTable), baseTable, columnNames); 030 } 031 032 private void addBeforeUpdate(DdlBuffer apply, String triggerName, String tableName, List<String> columnNames) { 033 034 addTriggerStart(triggerName, tableName, apply, " before update for each row as "); 035 036 apply.append(" NEW.sys_period_start = greatest(current_timestamp, date_add(OLD.sys_period_start, interval 1 microsecond))").endOfStatement(); 037 appendInsertIntoHistory(apply, tableName, columnNames); 038 addEndTrigger(apply); 039 } 040 041 private void addBeforeDelete(DdlBuffer apply, String triggerName, String tableName, List<String> columnNames) { 042 043 addTriggerStart(triggerName, tableName, apply, " before delete for each row as"); 044 appendInsertIntoHistory(apply, tableName, columnNames); 045 addEndTrigger(apply); 046 } 047 048 private void addTriggerStart(String triggerName, String baseTable, DdlBuffer apply, String s) { 049 apply 050 .append("delimiter $$").newLine() 051 .append("create or replace trigger ").append(triggerName).append(" for ").append(baseTable) 052 .append(s).newLine(); 053 } 054 055 private void addEndTrigger(DdlBuffer apply) { 056 apply.append("end_trigger") 057 .endOfStatement() 058 .append("$$").newLine() 059 .newLine(); 060 } 061 062}