mirror of
				https://github.com/vran-dev/databasir.git
				synced 2025-11-04 16:26:10 +08:00 
			
		
		
		
	feat: get table triggers from mariaDB (#189)
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
package com.databasir.core.meta.provider;
 | 
					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.maria.MariaTriggerMetaProvider;
 | 
				
			||||||
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.postgresql.PostgresqlTriggerMetaProvider;
 | 
				
			||||||
import com.databasir.core.meta.provider.sqlserver.SqlServerColumnMetaProvider;
 | 
					import com.databasir.core.meta.provider.sqlserver.SqlServerColumnMetaProvider;
 | 
				
			||||||
@@ -47,6 +48,9 @@ public class MetaProviders {
 | 
				
			|||||||
        if (url.contains(":postgresql:") || url.contains(":pgsql:")) {
 | 
					        if (url.contains(":postgresql:") || url.contains(":pgsql:")) {
 | 
				
			||||||
            return postgresql();
 | 
					            return postgresql();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (url.contains(":mariadb:")) {
 | 
				
			||||||
 | 
					            return mariaDB();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        return jdbc();
 | 
					        return jdbc();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -91,4 +95,18 @@ public class MetaProviders {
 | 
				
			|||||||
        );
 | 
					        );
 | 
				
			||||||
        return new JdbcDatabaseMetaProvider(tableMetaProvider);
 | 
					        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);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user