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}