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 * MySql history support using DB triggers to maintain a history table.
011 */
012public class MySqlHistoryDdl extends DbTriggerBasedHistoryDdl {
013
014  MySqlHistoryDdl() {
015  }
016
017  @Override
018  protected void dropTriggers(DdlBuffer buffer, String baseTable) throws IOException {
019    buffer.append("drop trigger ").append(updateTriggerName(baseTable)).endOfStatement();
020    buffer.append("drop trigger ").append(deleteTriggerName(baseTable)).endOfStatement();
021  }
022
023  @Override
024  protected void createTriggers(DdlWrite writer, MTable table) throws IOException {
025
026    DbTriggerUpdate update = createDbTriggerUpdate(writer, table);
027
028    addBeforeUpdate(updateTriggerName(update.getBaseTable()), update);
029    addBeforeDelete(deleteTriggerName(update.getBaseTable()), update);
030  }
031
032  @Override
033  protected void updateHistoryTriggers(DbTriggerUpdate update) throws IOException {
034
035    recreateHistoryView(update);
036
037    DdlBuffer buffer = update.historyTriggerBuffer();
038    String baseTable = update.getBaseTable();
039
040    dropTriggers(buffer, baseTable);
041    addBeforeUpdate(updateTriggerName(baseTable), update);
042    addBeforeDelete(deleteTriggerName(baseTable), update);
043  }
044
045  private void addBeforeUpdate(String triggerName, DbTriggerUpdate update) throws IOException {
046
047    DdlBuffer apply = update.historyTriggerBuffer();
048    apply
049      .append("delimiter $$").newLine()
050      .append("create trigger ").append(triggerName).append(" before update on ").append(update.getBaseTable())
051      .append(" for each row begin").newLine();
052    appendInsertIntoHistory(apply, update.getHistoryTable(), update.getColumns());
053    apply
054      .append("    set NEW.").append(sysPeriod).append("_start = now(6)").endOfStatement()
055      .append("end$$").newLine();
056  }
057
058  private void addBeforeDelete(String triggerName, DbTriggerUpdate update) throws IOException {
059
060    DdlBuffer apply = update.historyTriggerBuffer();
061    apply
062      .append("delimiter $$").newLine()
063      .append("create trigger ").append(triggerName).append(" before delete on ").append(update.getBaseTable())
064      .append(" for each row begin").newLine();
065    appendInsertIntoHistory(apply, update.getHistoryTable(), update.getColumns());
066    apply.append("end$$").newLine();
067  }
068
069}