diff --git a/meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java b/meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java index f9ad19b..d50e218 100644 --- a/meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java +++ b/meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java @@ -1,6 +1,7 @@ package com.databasir.core.meta.provider; import com.databasir.core.meta.provider.jdbc.*; +import com.databasir.core.meta.provider.maria.MariaTriggerMetaProvider; import com.databasir.core.meta.provider.mysql.MysqlTableTriggerMetaProvider; import com.databasir.core.meta.provider.postgresql.PostgresqlTriggerMetaProvider; import com.databasir.core.meta.provider.sqlserver.SqlServerColumnMetaProvider; @@ -47,6 +48,9 @@ public class MetaProviders { if (url.contains(":postgresql:") || url.contains(":pgsql:")) { return postgresql(); } + if (url.contains(":mariadb:")) { + return mariaDB(); + } return jdbc(); } @@ -91,4 +95,18 @@ public class MetaProviders { ); return new JdbcDatabaseMetaProvider(tableMetaProvider); } + + private static DatabaseMetaProvider mariaDB() { + var columnMetaProvider = new JdbcColumnMetaProvider(); + var foreignKeyMetaProvider = new JdbcForeignKeyMetaProvider(); + var indexMetaProvider = new JdbcIndexMetaProvider(); + var triggerMetaProvider = new MariaTriggerMetaProvider(); + var tableMetaProvider = new JdbcTableMetaProvider( + columnMetaProvider, + indexMetaProvider, + triggerMetaProvider, + foreignKeyMetaProvider + ); + return new JdbcDatabaseMetaProvider(tableMetaProvider); + } } diff --git a/meta/src/main/java/com/databasir/core/meta/provider/maria/MariaTriggerMetaProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/maria/MariaTriggerMetaProvider.java new file mode 100644 index 0000000..c5dcb8b --- /dev/null +++ b/meta/src/main/java/com/databasir/core/meta/provider/maria/MariaTriggerMetaProvider.java @@ -0,0 +1,65 @@ +package com.databasir.core.meta.provider.maria; + +import com.databasir.core.meta.data.TriggerMeta; +import com.databasir.core.meta.provider.TriggerMetaProvider; +import com.databasir.core.meta.provider.condition.TableCondition; +import lombok.extern.slf4j.Slf4j; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +@Slf4j +public class MariaTriggerMetaProvider implements TriggerMetaProvider { + @Override + public List selectTriggers(Connection connection, TableCondition condition) { + String sql = "SELECT \n" + + " TRIGGER_NAME,\n" + + " TRIGGER_SCHEMA,\n" + + " TRIGGER_CATALOG,\n" + + " EVENT_OBJECT_CATALOG,\n" + + " EVENT_OBJECT_SCHEMA,\n" + + " EVENT_OBJECT_TABLE,\n" + + " ACTION_STATEMENT,\n" + + " ACTION_TIMING,\n" + + " EVENT_MANIPULATION,\n" + + " CREATED\n" + + "FROM information_schema.triggers " + + "WHERE TRIGGER_SCHEMA = ? AND EVENT_OBJECT_TABLE = ?"; + try { + PreparedStatement preparedStatement = connection.prepareStatement(sql); + // TODO : mariaDB's default database is 'def', the schema is equal to the user's input db name + preparedStatement.setObject(1, condition.getDatabaseName()); + preparedStatement.setObject(2, condition.getTableName()); + ResultSet results = preparedStatement.executeQuery(); + List triggers = new ArrayList<>(); + while (results.next()) { + String name = Objects.requireNonNullElse(results.getString("TRIGGER_NAME"), ""); + String statement = results.getString("ACTION_STATEMENT"); + String timing = results.getString("ACTION_TIMING"); + String manipulation = results.getString("EVENT_MANIPULATION"); + String created = results.getString("CREATED"); + if (created == null) { + created = "unknown"; + } + TriggerMeta meta = TriggerMeta.builder() + .name(name) + .manipulation(manipulation) + .timing(timing) + .statement(statement) + .createAt(created) + .build(); + triggers.add(meta); + } + return triggers; + } catch (SQLException e) { + log.warn("get trigger meta failed", e); + return Collections.emptyList(); + } + } +}