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}