diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index b1a631c..d2e59da 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -130,9 +130,11 @@ module.exports = { collections[schemaName], data.recordSamplingSettings, data.includePartitions, + data.ignoreUdfUdpTriggers, ); const { functions, procedures, triggers } = await postgresService.retrieveSchemaLevelData( schemaName, + data.ignoreUdfUdpTriggers, ); postgresLogger.progress('Schema reversed successfully', schemaName); diff --git a/reverse_engineering/config.json b/reverse_engineering/config.json index 3c82fb6..0caf4f1 100644 --- a/reverse_engineering/config.json +++ b/reverse_engineering/config.json @@ -20,6 +20,11 @@ "inputLabel": "Include partitions", "inputTooltip": "Reverse-engineer all partitions as tables", "inputKeyword": "includePartitions" + }, + { + "inputLabel": "Ignore Functions, Procedures and Triggers", + "inputTooltip": "Ignore reverse-engineering of function, procedures and triggers", + "inputKeyword": "ignoreUdfUdpTriggers" } ] } \ No newline at end of file diff --git a/reverse_engineering/helpers/postgresService.js b/reverse_engineering/helpers/postgresService.js index 9d401e5..c0ba570 100644 --- a/reverse_engineering/helpers/postgresService.js +++ b/reverse_engineering/helpers/postgresService.js @@ -143,7 +143,13 @@ module.exports = { }); }, - async retrieveEntitiesData(schemaName, entitiesNames, recordSamplingSettings, includePartitions = false) { + async retrieveEntitiesData( + schemaName, + entitiesNames, + recordSamplingSettings, + includePartitions = false, + ignoreUdfUdpTriggers = false, + ) { const userDefinedTypes = await this._retrieveUserDefinedTypes(schemaName); const schemaOidResult = await db.queryTolerant(queryConstants.GET_NAMESPACE_OID, [schemaName], true); const schemaOid = schemaOidResult?.oid; @@ -168,15 +174,25 @@ module.exports = { schemaOid, schemaName, userDefinedTypes, + ignoreUdfUdpTriggers, ), ); - const views = await mapPromises(viewsNames, _.bind(this._retrieveSingleViewData, this, schemaOid, schemaName)); + const views = await mapPromises( + viewsNames, + _.bind(this._retrieveSingleViewData, this, schemaOid, schemaName, ignoreUdfUdpTriggers), + ); return { views, tables, modelDefinitions: getJsonSchema(userDefinedTypes) }; }, - async retrieveSchemaLevelData(schemaName) { + async retrieveSchemaLevelData(schemaName, ignoreUdfUdpTriggers) { + if (ignoreUdfUdpTriggers) { + logger.info('Functions and procedures ignored'); + + return { functions: [], procedures: [] }; + } + logger.progress('Get Functions and Procedures', schemaName); const schemaOid = (await db.queryTolerant(queryConstants.GET_NAMESPACE_OID, [schemaName], true))?.oid; @@ -245,6 +261,7 @@ module.exports = { schemaOid, schemaName, userDefinedTypes, + ignoreUdfUdpTriggers, { tableName, isParentPartitioned }, ) { logger.progress('Get table data', schemaName, tableName); @@ -268,11 +285,7 @@ module.exports = { const tableConstraintsResult = await db.queryTolerant(queryConstants.GET_TABLE_CONSTRAINTS, [tableOid]); const tableIndexesResult = await db.queryTolerant(getGetIndexesQuery(version), [tableOid]); const tableForeignKeys = await db.queryTolerant(queryConstants.GET_TABLE_FOREIGN_KEYS, [tableOid]); - const triggersData = await db.queryTolerant(queryConstants.GET_TRIGGERS, [schemaName, tableName]); - const triggersAdditionalData = await db.queryTolerant(queryConstants.GET_TRIGGERS_ADDITIONAL_DATA, [ - schemaOid, - tableOid, - ]); + const triggers = await this._getTriggers(schemaName, tableName, schemaOid, tableOid, ignoreUdfUdpTriggers); const partitioning = prepareTablePartition(partitionResult, tableColumns); const tableLevelProperties = prepareTableLevelData(tableLevelData, tableToastOptions); @@ -281,7 +294,6 @@ module.exports = { const tableConstraint = prepareTableConstraints(tableConstraintsResult, tableColumns, tableIndexesResult); const tableIndexes = prepareTableIndexes(tableIndexesResult); const relationships = prepareForeignKeys(tableForeignKeys, tableName, schemaName, tableColumns); - const triggers = getTriggers(triggersData, triggersAdditionalData); const tableData = { partitioning, @@ -316,6 +328,22 @@ module.exports = { }; }, + async _getTriggers(schemaName, objectName, schemaOid, objectOid, ignoreUdfUdpTriggers) { + if (ignoreUdfUdpTriggers) { + logger.info('Triggers ignored'); + + return []; + } + + const triggersData = await db.queryTolerant(queryConstants.GET_TRIGGERS, [schemaName, objectName]); + const triggersAdditionalData = await db.queryTolerant(queryConstants.GET_TRIGGERS_ADDITIONAL_DATA, [ + schemaOid, + objectOid, + ]); + + return getTriggers(triggersData, triggersAdditionalData); + }, + async _getTableColumns(tableName, schemaName, tableOid) { logger.progress('Get columns', schemaName, tableName); @@ -349,7 +377,7 @@ module.exports = { return await db.queryTolerant(queryConstants.GET_SAMPLED_DATA(fullTableName, jsonColumns), [limit]); }, - async _retrieveSingleViewData(schemaOid, schemaName, viewName) { + async _retrieveSingleViewData(schemaOid, schemaName, ignoreUdfUdpTriggers, viewName) { logger.progress('Get view data', schemaName, viewName); viewName = removeViewNameSuffix(viewName); @@ -359,12 +387,13 @@ module.exports = { !viewData.view_definition && (await db.queryTolerant(queryConstants.GET_VIEW_SELECT_STMT_FALLBACK, [viewName, schemaName], true)); const viewOptions = await db.queryTolerant(queryConstants.GET_VIEW_OPTIONS, [viewName, schemaOid], true); - const triggersData = await db.queryTolerant(queryConstants.GET_TRIGGERS, [schemaName, viewName]); - const triggersAdditionalData = await db.queryTolerant(queryConstants.GET_TRIGGERS_ADDITIONAL_DATA, [ + const triggers = await this._getTriggers( + schemaName, + viewName, schemaOid, viewOptions?.oid, - ]); - const triggers = getTriggers(triggersData, triggersAdditionalData); + ignoreUdfUdpTriggers, + ); const script = generateCreateViewScript(viewName, viewData, viewDefinitionFallback); const data = prepareViewData(viewData, viewOptions, triggers);