diff --git a/meta/src/main/java/com/databasir/core/meta/provider/AbstractSqlTriggerMetaProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/AbstractSqlTriggerMetaProvider.java new file mode 100644 index 0000000..1af2fc9 --- /dev/null +++ b/meta/src/main/java/com/databasir/core/meta/provider/AbstractSqlTriggerMetaProvider.java @@ -0,0 +1,82 @@ +package com.databasir.core.meta.provider; + +import com.databasir.core.meta.data.TriggerMeta; +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 abstract class AbstractSqlTriggerMetaProvider implements TriggerMetaProvider { + + @Override + public List selectTriggers(Connection connection, TableCondition condition) { + String sql = sql(condition); + PreparedStatement preparedStatement = null; + try { + preparedStatement = connection.prepareStatement(sql); + ResultSet results = preparedStatement.executeQuery(); + List triggers = new ArrayList<>(); + while (results.next()) { + String name = getTriggerName(results); + String statement = getStatement(results); + String timing = getTiming(results); + String manipulation = getManipulation(results); + String created = getCreateAt(results); + 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(); + } finally { + if (preparedStatement != null) { + try { + preparedStatement.close(); + } catch (SQLException e) { + // ignore + } + } + } + } + + protected abstract String sql(TableCondition condition); + + protected String getTriggerName(ResultSet results) throws SQLException { + return Objects.requireNonNullElse(results.getString("TRIGGER_NAME"), ""); + } + + protected String getStatement(ResultSet results) throws SQLException { + return results.getString("ACTION_STATEMENT"); + } + + protected String getTiming(ResultSet results) throws SQLException { + return results.getString("ACTION_TIMING"); + } + + protected String getManipulation(ResultSet results) throws SQLException { + return results.getString("EVENT_MANIPULATION"); + } + + protected String getCreateAt(ResultSet results) throws SQLException { + String created = results.getString("CREATED"); + if (created == null) { + return "unknown"; + } + return created; + } +} diff --git a/meta/src/main/java/com/databasir/core/meta/provider/SqlProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/SqlProvider.java deleted file mode 100644 index d19cc43..0000000 --- a/meta/src/main/java/com/databasir/core/meta/provider/SqlProvider.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.databasir.core.meta.provider; - -import java.util.Optional; - -/** - * TODO use to extension repository - */ -public interface SqlProvider { - - Default DEFAULT = new Default(); - - /** - *

- * generate sql to select database information, should return the follow columns - *

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
column name column type description nullable
TABLE_CAT String catalog name NO
- *
- * - */ - default Optional databaseMetaSql(String databaseName) { - return Optional.empty(); - } - - /** - * generate sql to select table information, should return the follow columns - * - * - * - * - * - * - * - * - * - * - * - * - * - *
column name column type description nullable
TABLE_CAT String catalog name NO
- * - */ - default Optional tableMetaSql(String databaseName, String tableName) { - return Optional.empty(); - } - - default Optional tableColumnMetaSql(String databaseName, String tableName) { - return Optional.empty(); - } - - default Optional tableIndexMetaSql(String databaseName, String tableName) { - return Optional.empty(); - } - - default Optional tableTriggerMetaSql(String databaseName, String tableName) { - return Optional.empty(); - } - - class Default implements SqlProvider { - - } -} diff --git a/meta/src/main/java/com/databasir/core/meta/provider/maria/MariaTriggerMetaProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/maria/MariaTriggerMetaProvider.java index c5dcb8b..1be00d3 100644 --- a/meta/src/main/java/com/databasir/core/meta/provider/maria/MariaTriggerMetaProvider.java +++ b/meta/src/main/java/com/databasir/core/meta/provider/maria/MariaTriggerMetaProvider.java @@ -1,23 +1,13 @@ 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.AbstractSqlTriggerMetaProvider; 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 { +public class MariaTriggerMetaProvider extends AbstractSqlTriggerMetaProvider { @Override - public List selectTriggers(Connection connection, TableCondition condition) { + protected String sql(TableCondition condition) { String sql = "SELECT \n" + " TRIGGER_NAME,\n" + " TRIGGER_SCHEMA,\n" @@ -30,36 +20,7 @@ public class MariaTriggerMetaProvider implements TriggerMetaProvider { + " 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 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(); - } + + "WHERE TRIGGER_SCHEMA = '%s' AND EVENT_OBJECT_TABLE = '%s'"; + return String.format(sql, condition.getDatabaseName(), condition.getTableName()); } } 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 0fa65c4..39dcc53 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 @@ -1,24 +1,13 @@ package com.databasir.core.meta.provider.mysql; -import com.databasir.core.meta.data.TriggerMeta; -import com.databasir.core.meta.provider.TriggerMetaProvider; +import com.databasir.core.meta.provider.AbstractSqlTriggerMetaProvider; 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 MysqlTableTriggerMetaProvider implements TriggerMetaProvider { - +public class MysqlTableTriggerMetaProvider extends AbstractSqlTriggerMetaProvider { @Override - public List selectTriggers(Connection connection, TableCondition condition) { + protected String sql(TableCondition condition) { String sql = "SELECT TRIGGER_CATALOG,\n" + " TRIGGER_SCHEMA,\n" + " TRIGGER_NAME,\n" @@ -38,36 +27,8 @@ public class MysqlTableTriggerMetaProvider implements TriggerMetaProvider { + " CREATED,\n" + " SQL_MODE,\n" + " DEFINER\n " - + "FROM information_schema.TRIGGERS WHERE EVENT_OBJECT_SCHEMA = ? AND EVENT_OBJECT_TABLE = ?"; - try { - PreparedStatement preparedStatement = connection.prepareStatement(sql); - preparedStatement.setObject(1, condition.getDatabaseName()); - preparedStatement.setObject(2, condition.getTableName()); - ResultSet results = preparedStatement.executeQuery(); - List 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(); - } + + "FROM information_schema.TRIGGERS WHERE EVENT_OBJECT_SCHEMA = '%s' AND EVENT_OBJECT_TABLE = '%s'"; + return String.format(sql, condition.getDatabaseName(), condition.getTableName()); } } diff --git a/meta/src/main/java/com/databasir/core/meta/provider/oracle/OracleTriggerMetaProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/oracle/OracleTriggerMetaProvider.java index 28c78a9..304a45b 100644 --- a/meta/src/main/java/com/databasir/core/meta/provider/oracle/OracleTriggerMetaProvider.java +++ b/meta/src/main/java/com/databasir/core/meta/provider/oracle/OracleTriggerMetaProvider.java @@ -1,64 +1,44 @@ package com.databasir.core.meta.provider.oracle; -import com.databasir.core.meta.data.TriggerMeta; -import com.databasir.core.meta.provider.TriggerMetaProvider; +import com.databasir.core.meta.provider.AbstractSqlTriggerMetaProvider; 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 OracleTriggerMetaProvider implements TriggerMetaProvider { +public class OracleTriggerMetaProvider extends AbstractSqlTriggerMetaProvider { @Override - public List selectTriggers(Connection connection, TableCondition condition) { + protected String sql(TableCondition condition) { String sql = "SELECT trig.table_owner AS schema_name,\n" + " trig.table_name,\n" + " trig.owner AS trigger_schema_name,\n" - + " trig.trigger_name,\n" - + " trig.trigger_type,\n" - + " trig.triggering_event,\n" + + " trig.trigger_name as TRIGGER_NAME,\n" + + " trig.trigger_type AS ACTION_TIMING,\n" + + " trig.triggering_event as EVENT_MANIPULATION,\n" + " trig.status,\n" - + " trig.trigger_body AS script\n" + + " trig.trigger_body AS ACTION_STATEMENT \n" + "FROM sys.all_triggers trig\n" + " INNER JOIN sys.all_tables tab ON trig.table_owner = tab.owner\n" + " AND trig.table_name = tab.table_name\n" - + "WHERE trig.base_object_type = 'TABLE' AND trig.owner = ? AND trig.TABLE_NAME = ?"; - try { - PreparedStatement preparedStatement = connection.prepareStatement(sql); - preparedStatement.setObject(1, condition.getSchemaName()); - preparedStatement.setObject(2, condition.getTableName()); - ResultSet results = preparedStatement.executeQuery(); - List triggers = new ArrayList<>(); - while (results.next()) { - String status = results.getString("status"); - String name = Objects.requireNonNullElse(results.getString("trigger_name"), "") - + " (" - + status - + ")"; - String statement = results.getString("script"); - String timing = results.getString("trigger_type"); - String manipulation = results.getString("triggering_event"); - String 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(); - } + + "WHERE trig.base_object_type = 'TABLE' AND trig.owner = '%s' AND trig.TABLE_NAME = '%s'"; + return String.format(sql, condition.getSchemaName(), condition.getTableName()); + } + + @Override + protected String getTriggerName(ResultSet results) throws SQLException { + String status = results.getString("status"); + String name = Objects.requireNonNullElse(results.getString("trigger_name"), "") + + " (" + + status + + ")"; + return name; + } + + @Override + protected String getCreateAt(ResultSet results) throws SQLException { + return "unknown"; } } 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 index 9ffe00b..3f77fc0 100644 --- 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 @@ -1,65 +1,25 @@ 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.AbstractSqlTriggerMetaProvider; 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 PostgresqlTriggerMetaProvider implements TriggerMetaProvider { +public class PostgresqlTriggerMetaProvider extends AbstractSqlTriggerMetaProvider { @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" + protected String sql(TableCondition condition) { + String sql = "SELECT trigger_name AS TRIGGER_NAME,\n" + + " action_timing AS ACTION_TIMING,\n" + + " event_manipulation AS EVENT_MANIPULATION,\n" + + " action_statement AS ACTION_STATEMENT,\n" + + " created AS CREATED,\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 = Objects.requireNonNullElse(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(); - } + + "WHERE trigger_catalog = '%s' AND trigger_schema = '%s' AND event_object_table = '%s';"; + return String.format(sql, condition.getDatabaseName(), condition.getSchemaName(), condition.getTableName()); } } 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 f2734e4..26aa246 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 @@ -1,29 +1,19 @@ package com.databasir.core.meta.provider.sqlserver; -import com.databasir.core.meta.data.TriggerMeta; -import com.databasir.core.meta.provider.TriggerMetaProvider; +import com.databasir.core.meta.provider.AbstractSqlTriggerMetaProvider; 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.List; -import java.util.Objects; - @Slf4j -public class SqlServerTriggerMetaProvider implements TriggerMetaProvider { - +public class SqlServerTriggerMetaProvider extends AbstractSqlTriggerMetaProvider { @Override - public List selectTriggers(Connection connection, TableCondition condition) { + protected String sql(TableCondition condition) { String sql = "SELECT SCHEMA_NAME(tab.schema_id) + '.' + tab.name AS table_name,\n" - + " trig.name AS trigger_name,\n" - + " trig.create_date AS create_date,\n" + + " trig.name AS TRIGGER_NAME,\n" + + " trig.create_date AS CREATED,\n" + " CASE\n" + " WHEN is_instead_of_trigger = 1 THEN 'Instead of'\n" - + " ELSE 'After' END AS timing,\n" + + " ELSE 'After' END AS ACTION_TIMING,\n" + " (CASE\n" + " WHEN OBJECTPROPERTY(trig.object_id, 'ExecIsUpdateTrigger') = 1\n" + " THEN 'Update '\n" @@ -36,7 +26,7 @@ public class SqlServerTriggerMetaProvider implements TriggerMetaProvider { + " WHEN OBJECTPROPERTY(trig.object_id, 'ExecIsInsertTrigger') = 1\n" + " THEN 'Insert '\n" + " ELSE '' END\n" - + " ) AS manipulation,\n" + + " ) AS EVENT_MANIPULATION,\n" + " CASE\n" + " WHEN trig.[type] = 'TA' THEN 'Assembly (CLR) trigger'\n" + " WHEN trig.[type] = 'TR' THEN 'SQL trigger'\n" @@ -44,50 +34,12 @@ public class SqlServerTriggerMetaProvider implements TriggerMetaProvider { + " CASE\n" + " WHEN is_disabled = 1 THEN 'Disabled'\n" + " ELSE 'Active' END AS [status],\n" - + " OBJECT_DEFINITION(trig.object_id) AS STATEMENT\n" + + " OBJECT_DEFINITION(trig.object_id) AS ACTION_STATEMENT\n" + "FROM sys.triggers trig\n" + " INNER JOIN sys.objects tab\n" + " ON trig.parent_id = tab.object_id\n" - + "WHERE SCHEMA_NAME(tab.schema_id) = ? AND tab.name = ?"; - PreparedStatement preparedStatement = null; - List triggerMetas = new ArrayList<>(); - try { - preparedStatement = connection.prepareStatement(sql); - preparedStatement.setString(1, condition.getSchemaName()); - preparedStatement.setString(2, condition.getTableName()); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - String triggerName = Objects.requireNonNullElse(resultSet.getString("trigger_name"), ""); - String timing = resultSet.getString("timing"); - String manipulation = resultSet.getString("manipulation"); - String statement = resultSet.getString("statement"); - String createAt = resultSet.getString("create_date"); - if (createAt == null) { - createAt = "unknown"; - } - triggerMetas.add(TriggerMeta.builder() - .name(triggerName) - .timing(timing) - .manipulation(manipulation) - .statement(statement) - .createAt(createAt) - .build()); - } - } catch (SQLException e) { - log.warn("ignore trigger meta by error {}", e.getMessage()); - if (log.isDebugEnabled()) { - log.debug("ignore trigger meta by error ", e); - } - } finally { - if (preparedStatement != null) { - try { - preparedStatement.close(); - } catch (SQLException e) { - // ignore - } - } - } - return triggerMetas; + + "WHERE SCHEMA_NAME(tab.schema_id) = '%s' AND tab.name = '%s'"; + return String.format(sql, condition.getSchemaName(), condition.getTableName()); } }