diff --git a/plugins/dbgate-plugin-firebird/src/backend/Analyser.js b/plugins/dbgate-plugin-firebird/src/backend/Analyser.js index 99ff48fd5..5b3fdac48 100644 --- a/plugins/dbgate-plugin-firebird/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-firebird/src/backend/Analyser.js @@ -1,6 +1,6 @@ const _ = require('lodash'); const sql = require('./sql'); -const { getDataTypeString } = require('./helpers'); +const { getDataTypeString, getTriggerTiming, getTriggerEventType } = require('./helpers'); const { DatabaseAnalyser } = require('dbgate-tools'); @@ -12,6 +12,7 @@ class Analyser extends DatabaseAnalyser { async _runAnalysis() { const tablesResult = await this.driver.query(this.dbhan, sql.tables); const columnsResult = await this.driver.query(this.dbhan, sql.columns); + const triggersResult = await this.driver.query(this.dbhan, sql.triggers); const columns = columnsResult.rows.map(i => ({ tableName: i.TABLENAME, @@ -28,6 +29,7 @@ class Analyser extends DatabaseAnalyser { pureName: i.PURENAME, schemaName: i.SCHEMANAME, })); + const tables = tablesResult.rows.map(i => ({ pureName: i.PURENAME, objectId: i.OBJECTID, @@ -35,6 +37,14 @@ class Analyser extends DatabaseAnalyser { objectComment: i.OBJECTCOMMENT, })); + const triggers = triggersResult.rows.map(i => ({ + pureName: i.PURENAME, + tableName: i.TABLENAME, + shcemaName: i.SCHEMANAME, + eventType: getTriggerEventType(i.TRIGGERTYPE), + triggerTiming: getTriggerTiming(i.TRIGGERTYPE), + })); + return { tables: tables.map(table => ({ ...table, @@ -42,6 +52,7 @@ class Analyser extends DatabaseAnalyser { column => column.tableName === table.pureName && column.schemaName === table.schemaName ), })), + triggers, }; } diff --git a/plugins/dbgate-plugin-firebird/src/backend/helpers.js b/plugins/dbgate-plugin-firebird/src/backend/helpers.js index a86d7f2b1..868296713 100644 --- a/plugins/dbgate-plugin-firebird/src/backend/helpers.js +++ b/plugins/dbgate-plugin-firebird/src/backend/helpers.js @@ -49,6 +49,38 @@ function getDataTypeString(column) { } } +const eventMap = { + 1: { triggerTiming: 'BEFORE', eventType: 'INSERT' }, + 2: { triggerTiming: 'AFTER', eventType: 'INSERT' }, + 3: { triggerTiming: 'BEFORE', eventType: 'UPDATE' }, + 4: { triggerTiming: 'AFTER', eventType: 'UPDATE' }, + 5: { triggerTiming: 'BEFORE', eventType: 'DELETE' }, + 6: { triggerTiming: 'AFTER', eventType: 'DELETE' }, + 17: { triggerTiming: 'BEFORE', eventType: 'INSERT' }, // OR UPDATE + 18: { triggerTiming: 'AFTER', eventType: 'INSERT' }, // OR UPDATE + 25: { triggerTiming: 'BEFORE', eventType: 'INSERT' }, // OR DELETE + 26: { triggerTiming: 'AFTER', eventType: 'INSERT' }, // OR DELETE + 27: { triggerTiming: 'BEFORE', eventType: 'UPDATE' }, // OR DELETE + 28: { triggerTiming: 'AFTER', eventType: 'UPDATE' }, // OR DELETE + 113: { triggerTiming: 'BEFORE', eventType: 'INSERT' }, // OR UPDATE OR DELETE + 114: { triggerTiming: 'AFTER', eventType: 'INSERT' }, // OR UPDATE OR DELETE + 8192: { triggerTiming: 'BEFORE EVENT', eventType: null }, // ON CONNECT + 8193: { triggerTiming: 'AFTER EVENT', eventType: null }, // ON DISCONNECT + 8194: { triggerTiming: 'BEFORE STATEMENT', eventType: null }, // ON TRANSACTION START + 8195: { triggerTiming: 'AFTER STATEMENT', eventType: null }, // ON TRANSACTION COMMIT + 8196: { triggerTiming: 'AFTER STATEMENT', eventType: null }, // ON TRANSACTION ROLLBACK +}; + +function getTriggerEventType(triggerType) { + return eventMap[triggerType]?.eventType || null; +} + +function getTriggerTiming(triggerType) { + return eventMap[triggerType]?.triggerTiming || null; +} + module.exports = { getDataTypeString, + getTriggerEventType, + getTriggerTiming, }; diff --git a/plugins/dbgate-plugin-firebird/src/backend/sql/index.js b/plugins/dbgate-plugin-firebird/src/backend/sql/index.js index 5b56564ce..f31c83640 100644 --- a/plugins/dbgate-plugin-firebird/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-firebird/src/backend/sql/index.js @@ -1,9 +1,11 @@ const version = require('./version'); const tables = require('./tables'); const columns = require('./columns'); +const triggers = require('./triggers'); module.exports = { version, columns, tables, + triggers, }; diff --git a/plugins/dbgate-plugin-firebird/src/backend/sql/triggers.js b/plugins/dbgate-plugin-firebird/src/backend/sql/triggers.js new file mode 100644 index 000000000..2f49b62d9 --- /dev/null +++ b/plugins/dbgate-plugin-firebird/src/backend/sql/triggers.js @@ -0,0 +1,12 @@ +module.exports = ` +SELECT + TRIM(rtr.RDB$TRIGGER_NAME) as PURENAME, + TRIM(rtr.RDB$RELATION_NAME) as TABLENAME, + rtr.RDB$TRIGGER_TYPE as TRIGGERTYPE, + TRIM(rel.RDB$OWNER_NAME) AS SCHEMANAME +FROM + RDB$TRIGGERS rtr +JOIN RDB$RELATIONS rel ON rtr.RDB$RELATION_NAME = rel.RDB$RELATION_NAME +WHERE rtr.RDB$SYSTEM_FLAG = 0 +ORDER BY rtr.RDB$TRIGGER_NAME +`;