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}