mirror of
				https://github.com/vran-dev/databasir.git
				synced 2025-10-31 20:49:22 +08:00 
			
		
		
		
	feat: get table triggers from mariaDB (#189)
This commit is contained in:
		| @@ -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); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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