feat: get table triggers from mariaDB (#189)

This commit is contained in:
vran 2022-05-17 15:02:54 +08:00 committed by GitHub
parent d39eda36f7
commit 348a6e85dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 83 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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<TriggerMeta> 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<TriggerMeta> 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();
}
}
}