From 63a409f88af024153143b706c4b3ae243b33c928 Mon Sep 17 00:00:00 2001 From: vran Date: Tue, 17 May 2022 13:07:40 +0800 Subject: [PATCH] feat: support get table trigger from postgresql --- .../converter/DocumentPojoConverter.java | 7 +- .../core/meta/provider/MetaProviders.java | 18 ++++++ .../mysql/MysqlTableTriggerMetaProvider.java | 12 +--- .../PostgresqlTriggerMetaProvider.java | 64 +++++++++++++++++++ .../SqlServerTriggerMetaProvider.java | 14 +--- 5 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 meta/src/main/java/com/databasir/core/meta/provider/postgresql/PostgresqlTriggerMetaProvider.java diff --git a/core/src/main/java/com/databasir/core/domain/document/converter/DocumentPojoConverter.java b/core/src/main/java/com/databasir/core/domain/document/converter/DocumentPojoConverter.java index fbdf976..d068fc4 100644 --- a/core/src/main/java/com/databasir/core/domain/document/converter/DocumentPojoConverter.java +++ b/core/src/main/java/com/databasir/core/domain/document/converter/DocumentPojoConverter.java @@ -7,8 +7,6 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; @@ -60,14 +58,11 @@ public interface DocumentPojoConverter { } @Mapping(target = "triggerCreateAt", source = "meta.createAt") + @Mapping(target = "createAt", ignore = true) TableTriggerDocumentPojo toTriggerPojo(Integer databaseDocumentId, Integer tableDocumentId, TriggerMeta meta); - default LocalDateTime toLocalDateTime(String dateTime) { - return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - } - default List toForeignKeyPojo(Integer docId, Integer tableMetaId, List foreignKeys) { 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 709de74..f9ad19b 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 @@ -2,6 +2,7 @@ package com.databasir.core.meta.provider; import com.databasir.core.meta.provider.jdbc.*; import com.databasir.core.meta.provider.mysql.MysqlTableTriggerMetaProvider; +import com.databasir.core.meta.provider.postgresql.PostgresqlTriggerMetaProvider; import com.databasir.core.meta.provider.sqlserver.SqlServerColumnMetaProvider; import com.databasir.core.meta.provider.sqlserver.SqlServerTableMetaProvider; import com.databasir.core.meta.provider.sqlserver.SqlServerTriggerMetaProvider; @@ -43,6 +44,9 @@ public class MetaProviders { if (url.contains(":mysql:")) { return mysql(); } + if (url.contains(":postgresql:") || url.contains(":pgsql:")) { + return postgresql(); + } return jdbc(); } @@ -73,4 +77,18 @@ public class MetaProviders { ); return new JdbcDatabaseMetaProvider(tableMetaProvider); } + + private static DatabaseMetaProvider postgresql() { + var columnMetaProvider = new JdbcColumnMetaProvider(); + var foreignKeyMetaProvider = new JdbcForeignKeyMetaProvider(); + var indexMetaProvider = new JdbcIndexMetaProvider(); + var triggerMetaProvider = new PostgresqlTriggerMetaProvider(); + var tableMetaProvider = new JdbcTableMetaProvider( + columnMetaProvider, + indexMetaProvider, + triggerMetaProvider, + foreignKeyMetaProvider + ); + return new JdbcDatabaseMetaProvider(tableMetaProvider); + } } diff --git a/meta/src/main/java/com/databasir/core/meta/provider/mysql/MysqlTableTriggerMetaProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/mysql/MysqlTableTriggerMetaProvider.java index a1abad8..50401fe 100644 --- a/meta/src/main/java/com/databasir/core/meta/provider/mysql/MysqlTableTriggerMetaProvider.java +++ b/meta/src/main/java/com/databasir/core/meta/provider/mysql/MysqlTableTriggerMetaProvider.java @@ -12,15 +12,10 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; @Slf4j public class MysqlTableTriggerMetaProvider implements TriggerMetaProvider { - private static final Pattern DATE_TIME_PATTERN = - Pattern.compile("(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(.*)"); - @Override public List selectTriggers(Connection connection, TableCondition condition) { String sql = "SELECT TRIGGER_CATALOG,\n" @@ -55,11 +50,8 @@ public class MysqlTableTriggerMetaProvider implements TriggerMetaProvider { String timing = results.getString("ACTION_TIMING"); String manipulation = results.getString("EVENT_MANIPULATION"); String created = results.getString("CREATED"); - if (created != null) { - Matcher matcher = DATE_TIME_PATTERN.matcher(created); - if (matcher.matches()) { - created = matcher.group(1); - } + if (created == null) { + created = "unknown"; } TriggerMeta meta = TriggerMeta.builder() .name(name) diff --git a/meta/src/main/java/com/databasir/core/meta/provider/postgresql/PostgresqlTriggerMetaProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/postgresql/PostgresqlTriggerMetaProvider.java new file mode 100644 index 0000000..6d2c2cc --- /dev/null +++ b/meta/src/main/java/com/databasir/core/meta/provider/postgresql/PostgresqlTriggerMetaProvider.java @@ -0,0 +1,64 @@ +package com.databasir.core.meta.provider.postgresql; + +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; + +@Slf4j +public class PostgresqlTriggerMetaProvider implements TriggerMetaProvider { + @Override + public List selectTriggers(Connection connection, TableCondition condition) { + String sql = "SELECT trigger_name AS name,\n" + + " action_timing AS timing,\n" + + " event_manipulation AS manipulation,\n" + + " action_statement AS statement,\n" + + " created AS trigger_create_at,\n" + + " trigger_catalog AS trigger_catalog,\n" + + " TRIGGER_SCHEMA AS trigger_schema,\n" + + " event_object_catalog AS target_catalog,\n" + + " event_object_schema AS target_schema,\n" + + " event_object_table AS target_table_name\n" + + "FROM information_schema.triggers " + + "WHERE trigger_catalog = ? AND trigger_schema = ? AND event_object_table = ?;"; + try { + PreparedStatement preparedStatement = connection.prepareStatement(sql); + preparedStatement.setObject(1, condition.getDatabaseName()); + preparedStatement.setObject(2, condition.getSchemaName()); + preparedStatement.setObject(3, condition.getTableName()); + ResultSet results = preparedStatement.executeQuery(); + List triggers = new ArrayList<>(); + while (results.next()) { + String name = results.getString("name"); + String statement = results.getString("statement"); + String timing = results.getString("timing"); + String manipulation = results.getString("manipulation"); + // postgresql default is null + String created = results.getString("trigger_create_at"); + 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("postgresql get trigger meta failed", e); + return Collections.emptyList(); + } + } +} diff --git a/meta/src/main/java/com/databasir/core/meta/provider/sqlserver/SqlServerTriggerMetaProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/sqlserver/SqlServerTriggerMetaProvider.java index c66dfa5..6703f82 100644 --- a/meta/src/main/java/com/databasir/core/meta/provider/sqlserver/SqlServerTriggerMetaProvider.java +++ b/meta/src/main/java/com/databasir/core/meta/provider/sqlserver/SqlServerTriggerMetaProvider.java @@ -11,15 +11,10 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; @Slf4j public class SqlServerTriggerMetaProvider implements TriggerMetaProvider { - private static final Pattern DATE_TIME_PATTERN = - Pattern.compile("(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(.*)"); - @Override public List selectTriggers(Connection connection, TableCondition condition) { String sql = "SELECT SCHEMA_NAME(tab.schema_id) + '.' + tab.name AS table_name,\n" @@ -65,12 +60,9 @@ public class SqlServerTriggerMetaProvider implements TriggerMetaProvider { String timing = resultSet.getString("timing"); String manipulation = resultSet.getString("manipulation"); String statement = resultSet.getString("statement"); - Matcher matcher = DATE_TIME_PATTERN.matcher(resultSet.getString("create_date")); - String createAt; - if (matcher.matches()) { - createAt = matcher.group(1); - } else { - createAt = "1970-01-01 00:00:00"; + String createAt = resultSet.getString("create_date"); + if (createAt == null) { + createAt = "unknown"; } triggerMetas.add(TriggerMeta.builder() .name(triggerName)