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}