001package io.ebeaninternal.dbmigration.ddlgeneration.platform;
002
003import java.util.List;
004
005import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer;
006
007/**
008 * MySql history support using DB triggers to maintain a history table.
009 */
010public class MySqlHistoryDdl extends DbTriggerBasedHistoryDdl {
011
012  MySqlHistoryDdl() {
013  }
014
015  @Override
016  protected void dropTriggers(DdlBuffer buffer, String baseTable) {
017    buffer.append("drop trigger ").append(updateTriggerName(baseTable)).endOfStatement();
018    buffer.append("drop trigger ").append(deleteTriggerName(baseTable)).endOfStatement();
019  }
020
021  @Override
022  protected void createTriggers(DdlBuffer buffer, String baseTable, List<String> columnNames) {
023    buffer.append("lock tables ").append(baseTable).append(" write").endOfStatement();
024    addBeforeUpdate(buffer, updateTriggerName(baseTable), baseTable, columnNames);
025    addBeforeDelete(buffer, deleteTriggerName(baseTable), baseTable, columnNames);
026    buffer.appendStatement("unlock tables");
027  }
028
029  private void addBeforeUpdate(DdlBuffer apply, String triggerName, String tableName, List<String> columnNames) {
030    apply
031      .append("delimiter $$").newLine()
032      .append("create trigger ").append(triggerName).append(" before update on ").append(tableName)
033      .append(" for each row begin").newLine();
034    appendInsertIntoHistory(apply, tableName, columnNames);
035    apply
036      .append("    set NEW.").append(sysPeriod).append("_start = now(6)").endOfStatement()
037      .append("end$$").newLine();
038  }
039
040  private void addBeforeDelete(DdlBuffer apply, String triggerName, String tableName, List<String> columnNames) {
041    apply
042      .append("delimiter $$").newLine()
043      .append("create trigger ").append(triggerName).append(" before delete on ").append(tableName)
044      .append(" for each row begin").newLine();
045    appendInsertIntoHistory(apply, tableName, columnNames);
046    apply.append("end$$").newLine();
047  }
048
049}