feat: support get table trigger from postgresql
This commit is contained in:
parent
0d42836ba7
commit
63a409f88a
|
@ -7,8 +7,6 @@ import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.Mapping;
|
import org.mapstruct.Mapping;
|
||||||
import org.mapstruct.ReportingPolicy;
|
import org.mapstruct.ReportingPolicy;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.time.format.DateTimeFormatter;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@ -60,14 +58,11 @@ public interface DocumentPojoConverter {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Mapping(target = "triggerCreateAt", source = "meta.createAt")
|
@Mapping(target = "triggerCreateAt", source = "meta.createAt")
|
||||||
|
@Mapping(target = "createAt", ignore = true)
|
||||||
TableTriggerDocumentPojo toTriggerPojo(Integer databaseDocumentId,
|
TableTriggerDocumentPojo toTriggerPojo(Integer databaseDocumentId,
|
||||||
Integer tableDocumentId,
|
Integer tableDocumentId,
|
||||||
TriggerMeta meta);
|
TriggerMeta meta);
|
||||||
|
|
||||||
default LocalDateTime toLocalDateTime(String dateTime) {
|
|
||||||
return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
||||||
}
|
|
||||||
|
|
||||||
default List<TableForeignKeyDocumentPojo> toForeignKeyPojo(Integer docId,
|
default List<TableForeignKeyDocumentPojo> toForeignKeyPojo(Integer docId,
|
||||||
Integer tableMetaId,
|
Integer tableMetaId,
|
||||||
List<ForeignKeyMeta> foreignKeys) {
|
List<ForeignKeyMeta> foreignKeys) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.databasir.core.meta.provider;
|
||||||
|
|
||||||
import com.databasir.core.meta.provider.jdbc.*;
|
import com.databasir.core.meta.provider.jdbc.*;
|
||||||
import com.databasir.core.meta.provider.mysql.MysqlTableTriggerMetaProvider;
|
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.SqlServerColumnMetaProvider;
|
||||||
import com.databasir.core.meta.provider.sqlserver.SqlServerTableMetaProvider;
|
import com.databasir.core.meta.provider.sqlserver.SqlServerTableMetaProvider;
|
||||||
import com.databasir.core.meta.provider.sqlserver.SqlServerTriggerMetaProvider;
|
import com.databasir.core.meta.provider.sqlserver.SqlServerTriggerMetaProvider;
|
||||||
|
@ -43,6 +44,9 @@ public class MetaProviders {
|
||||||
if (url.contains(":mysql:")) {
|
if (url.contains(":mysql:")) {
|
||||||
return mysql();
|
return mysql();
|
||||||
}
|
}
|
||||||
|
if (url.contains(":postgresql:") || url.contains(":pgsql:")) {
|
||||||
|
return postgresql();
|
||||||
|
}
|
||||||
return jdbc();
|
return jdbc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,4 +77,18 @@ public class MetaProviders {
|
||||||
);
|
);
|
||||||
return new JdbcDatabaseMetaProvider(tableMetaProvider);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,15 +12,10 @@ import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class MysqlTableTriggerMetaProvider implements TriggerMetaProvider {
|
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
|
@Override
|
||||||
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
||||||
String sql = "SELECT TRIGGER_CATALOG,\n"
|
String sql = "SELECT TRIGGER_CATALOG,\n"
|
||||||
|
@ -55,11 +50,8 @@ public class MysqlTableTriggerMetaProvider implements TriggerMetaProvider {
|
||||||
String timing = results.getString("ACTION_TIMING");
|
String timing = results.getString("ACTION_TIMING");
|
||||||
String manipulation = results.getString("EVENT_MANIPULATION");
|
String manipulation = results.getString("EVENT_MANIPULATION");
|
||||||
String created = results.getString("CREATED");
|
String created = results.getString("CREATED");
|
||||||
if (created != null) {
|
if (created == null) {
|
||||||
Matcher matcher = DATE_TIME_PATTERN.matcher(created);
|
created = "unknown";
|
||||||
if (matcher.matches()) {
|
|
||||||
created = matcher.group(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
TriggerMeta meta = TriggerMeta.builder()
|
TriggerMeta meta = TriggerMeta.builder()
|
||||||
.name(name)
|
.name(name)
|
||||||
|
|
|
@ -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<TriggerMeta> 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<TriggerMeta> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,15 +11,10 @@ import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class SqlServerTriggerMetaProvider implements TriggerMetaProvider {
|
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
|
@Override
|
||||||
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
||||||
String sql = "SELECT SCHEMA_NAME(tab.schema_id) + '.' + tab.name AS table_name,\n"
|
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 timing = resultSet.getString("timing");
|
||||||
String manipulation = resultSet.getString("manipulation");
|
String manipulation = resultSet.getString("manipulation");
|
||||||
String statement = resultSet.getString("statement");
|
String statement = resultSet.getString("statement");
|
||||||
Matcher matcher = DATE_TIME_PATTERN.matcher(resultSet.getString("create_date"));
|
String createAt = resultSet.getString("create_date");
|
||||||
String createAt;
|
if (createAt == null) {
|
||||||
if (matcher.matches()) {
|
createAt = "unknown";
|
||||||
createAt = matcher.group(1);
|
|
||||||
} else {
|
|
||||||
createAt = "1970-01-01 00:00:00";
|
|
||||||
}
|
}
|
||||||
triggerMetas.add(TriggerMeta.builder()
|
triggerMetas.add(TriggerMeta.builder()
|
||||||
.name(triggerName)
|
.name(triggerName)
|
||||||
|
|
Loading…
Reference in New Issue