001package io.ebeaninternal.dbmigration.ddlgeneration.platform; 002 003import io.ebean.config.DatabaseConfig; 004import io.ebeaninternal.dbmigration.ddlgeneration.DdlAlterTable; 005import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer; 006import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; 007import io.ebeaninternal.dbmigration.migration.AddHistoryTable; 008import io.ebeaninternal.dbmigration.migration.DropHistoryTable; 009import io.ebeaninternal.dbmigration.model.MTable; 010 011/** 012 * History DDL for MariaDB. 013 */ 014public class MariaDbHistoryDdl implements PlatformHistoryDdl { 015 016 private PlatformDdl platformDdl; 017 018 @Override 019 public void configure(DatabaseConfig config, PlatformDdl platformDdl) { 020 this.platformDdl = platformDdl; 021 } 022 023 @Override 024 public void createWithHistory(DdlWrite writer, MTable table) { 025 String baseTable = table.getName(); 026 enableSystemVersioning(writer, baseTable); 027 } 028 029 private void enableSystemVersioning(DdlWrite writer, String baseTable) { 030 platformDdl.alterTable(writer, baseTable).append("add system versioning", null); 031 032 DdlBuffer drop = writer.dropAll(); 033 drop.append("alter table ").append(baseTable).append(" drop system versioning").endOfStatement(); 034 } 035 036 @Override 037 public void dropHistoryTable(DdlWrite writer, DropHistoryTable dropHistoryTable) { 038 String baseTable = dropHistoryTable.getBaseTable(); 039 platformDdl.alterTable(writer, baseTable).append("drop system versioning", null); 040 } 041 042 @Override 043 public void addHistoryTable(DdlWrite writer, AddHistoryTable addHistoryTable) { 044 String baseTable = addHistoryTable.getBaseTable(); 045 enableSystemVersioning(writer, baseTable); 046 } 047 048 @Override 049 public void updateTriggers(DdlWrite writer, String tableName) { 050 MTable table = writer.getTable(tableName); 051 // For MariaDB we need to enable system_versioning_alter_history only once 052 // per DDL script. This info is stored in the virtual "__$HISTORY_FLAG__" table 053 DdlAlterTable history = platformDdl.alterTable(writer, "__$HISTORY_FLAG__"); 054 if (table != null && table.isWithHistory() && !history.isHistoryHandled()) { 055 writer.apply().appendStatement("SET @@system_versioning_alter_history = 1"); 056 history.setHistoryHandled(); 057 } 058 } 059}