From c3202feb824cc2ece88824cbee436f3bb4621429 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Thu, 11 Jun 2026 18:49:44 +0300 Subject: [PATCH 1/2] HCK-16516: Added logic to skip procedures during RE --- localization/en.json | 1 + .../databaseService/databaseService.js | 29 +++++++++++++++++-- .../helpers/getOptionsFromConnectionInfo.js | 1 + .../reverseEngineeringService.js | 27 +++++++++++++++-- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/localization/en.json b/localization/en.json index a253c7a8..76327b78 100644 --- a/localization/en.json +++ b/localization/en.json @@ -79,6 +79,7 @@ "MODAL_WINDOW___SUBDOCUMENT_IN_CHILD": "Sub-document in child", "MODAL_WINDOW___ARRAY_IN_PARENT": "Array in parent", "MODAL_WINDOW___INCLUDE_EMPTY_COLLECTION": "Include empty tables", + "MODAL_WINDOW___INCLUDE_PROCEDURES": "Include stored procedures", "MODAL_WINDOW___CREATE_COLLECTION": "Create table", "MODAL_WINDOW___CREATE_BUCKET": "Create schema", "MODAL_WINDOW___ALL_COLLECTIONS": "and all nested tables", diff --git a/reverse_engineering/databaseService/databaseService.js b/reverse_engineering/databaseService/databaseService.js index 3d1f40b5..1b3467cb 100644 --- a/reverse_engineering/databaseService/databaseService.js +++ b/reverse_engineering/databaseService/databaseService.js @@ -316,6 +316,7 @@ const getDatabaseIndexes = async ({ client, dbName, tablesInfo, logger }) => { const getIndexesBucketCount = async ({ client, dbName, indexesId, logger }) => { if (!indexesId.length) { + logger.log('info', { message: `No database indexes to get. Skipping...` }, 'Reverse Engineering'); return []; } @@ -1000,7 +1001,21 @@ const getWhereClauseForUniqueSchemasAndTables = ({ tableAlias, allUniqueSchemasA `OBJECT_SCHEMA_NAME(${tableAlias}.object_id) IN (${[...schemas].join(', ')}) AND OBJECT_NAME(${tableAlias}.object_id) IN (${[...tables].join(', ')})`; -const getDatabaseProcedures = async ({ client, dbName, logger }) => { +const getDatabaseProcedures = async ({ client, dbName, logger, includeProcedures }) => { + if (!includeProcedures) { + logger.log( + 'info', + { message: 'Stored procedures not included in reverse-engineering options. Skipping...' }, + 'Reverse Engineering', + ); + logger.progress({ + message: 'Skipping discovering stored procedure metadata', + containerName: dbName, + entityName: '', + }); + return []; + } + const currentDbConnectionClient = await getClient({ client, dbName, @@ -1035,7 +1050,17 @@ const getDatabaseProcedures = async ({ client, dbName, logger }) => { const rawProcedures = await mapResponse(response); - return rawProcedures.map(parseProcedure(logger)); + logger.log('info', { message: `Parsing procedures.` }, 'Reverse Engineering'); + logger.progress({ message: 'Parsing procedures', containerName: dbName, entityName: '' }); + const start = Date.now(); + const parsedProcedures = rawProcedures.map(parseProcedure(logger)); + logger.log( + 'info', + { message: `Procedures parsed. Time taken to parse procedures: ${Date.now() - start}ms` }, + 'Reverse Engineering', + ); + + return parsedProcedures; }; module.exports = { diff --git a/reverse_engineering/helpers/getOptionsFromConnectionInfo.js b/reverse_engineering/helpers/getOptionsFromConnectionInfo.js index 9e0ba1b2..3448bac7 100644 --- a/reverse_engineering/helpers/getOptionsFromConnectionInfo.js +++ b/reverse_engineering/helpers/getOptionsFromConnectionInfo.js @@ -1,6 +1,7 @@ const getOptionsFromConnectionInfo = connectionInfo => ({ includeEmptyCollection: connectionInfo.includeEmptyCollection, isFieldOrderAlphabetic: connectionInfo.fieldInference.active === 'alphabetical', + includeProcedures: connectionInfo.includeProcedures || false, recordSamplingSettings: { ...connectionInfo.recordSamplingSettings, }, diff --git a/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js b/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js index 8de2b9e7..1663d1ba 100644 --- a/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js +++ b/reverse_engineering/reverseEngineeringService/reverseEngineeringService.js @@ -285,30 +285,46 @@ const addTotalBucketCountToDatabaseIndexes = ({ databaseIndexes, indexesBucketCo }); }; -const fetchDatabaseMetadata = async ({ client, dbName, tablesInfo, logger }) => { +const logDiscoveredMetadataCount = ({ logger, label, items = [] }) => { + logger.log('info', { message: `Found ${items.length} ${label}.` }, 'Reverse Engineering'); +}; + +const fetchDatabaseMetadata = async ({ client, dbName, tablesInfo, logger, reverseEngineeringOptions }) => { + const { includeProcedures = false } = reverseEngineeringOptions; const allUniqueSchemasAndTables = getAllUniqueSchemasAndTables({ tablesInfo }); const rawDatabaseIndexes = await getDatabaseIndexes({ client, dbName, tablesInfo, logger }); + logDiscoveredMetadataCount({ logger, label: 'database indexes', items: rawDatabaseIndexes }); + const databaseCheckConstraints = await getDatabaseCheckConstraints({ client, dbName, allUniqueSchemasAndTables, logger, }); + logDiscoveredMetadataCount({ logger, label: 'check constraints', items: databaseCheckConstraints }); + const viewsIndexes = await getViewsIndexes({ client, dbName, logger }); + logDiscoveredMetadataCount({ logger, label: 'view indexes', items: viewsIndexes }); + const fullTextIndexes = await getFullTextIndexes({ client, dbName, allUniqueSchemasAndTables, logger, }); + logDiscoveredMetadataCount({ logger, label: 'full-text indexes', items: fullTextIndexes }); + const spatialIndexes = await getSpatialIndexes({ client, dbName, allUniqueSchemasAndTables, logger, }); - const procedures = await getDatabaseProcedures({ client, dbName, logger }); + logDiscoveredMetadataCount({ logger, label: 'spatial indexes', items: spatialIndexes }); + + const procedures = await getDatabaseProcedures({ client, dbName, logger, includeProcedures }); + const indexesBucketCount = await getIndexesBucketCount({ client, dbName, @@ -316,13 +332,18 @@ const fetchDatabaseMetadata = async ({ client, dbName, tablesInfo, logger }) => logger, }); const databaseUDT = await getDatabaseUserDefinedTypes({ client, dbName, logger }); + logDiscoveredMetadataCount({ logger, label: 'user-defined types', items: databaseUDT }); + const databaseMemoryOptimizedTables = await getDatabaseMemoryOptimizedTables({ client, dbName, logger }); + logDiscoveredMetadataCount({ logger, label: 'memory-optimized tables', items: databaseMemoryOptimizedTables }); + const xmlSchemaCollections = await getDatabaseXmlSchemaCollection({ client, dbName, allUniqueSchemasAndTables, logger, }); + logDiscoveredMetadataCount({ logger, label: 'xml schema collection usages', items: xmlSchemaCollections }); const uniqueDatabaseIndexesColumns = getUniqueIndexesColumns({ indexesColumns: rawDatabaseIndexes }); const databaseIndexes = addTotalBucketCountToDatabaseIndexes({ @@ -564,7 +585,7 @@ const reverseCollectionsToJSON = async ({ client, tablesInfo, reverseEngineering fullTextIndexes, spatialIndexes, procedures, - } = await fetchDatabaseMetadata({ client, dbName, tablesInfo, logger }); + } = await fetchDatabaseMetadata({ client, dbName, tablesInfo, logger, reverseEngineeringOptions }); return processSchemas({ tablesInfo, From 6a76068ca98690f4de1092d57f5677c0f043b664 Mon Sep 17 00:00:00 2001 From: yevhenii-moroziuk Date: Fri, 12 Jun 2026 07:23:56 +0300 Subject: [PATCH 2/2] HCK-16516: Fix typo & improve log messages --- reverse_engineering/databaseService/databaseService.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reverse_engineering/databaseService/databaseService.js b/reverse_engineering/databaseService/databaseService.js index 1b3467cb..afb97a58 100644 --- a/reverse_engineering/databaseService/databaseService.js +++ b/reverse_engineering/databaseService/databaseService.js @@ -875,7 +875,7 @@ const getTableDefaultConstraintNames = async ({ client, dbName, tableName, schem client, dbName, meta: { - action: 'getting default cosntraint names', + action: 'getting default constraint names', objects: ['sys.all_columns', 'sys.tables', 'sys.schemas', 'sys.default_constraints'], skip: true, }, @@ -1005,11 +1005,11 @@ const getDatabaseProcedures = async ({ client, dbName, logger, includeProcedures if (!includeProcedures) { logger.log( 'info', - { message: 'Stored procedures not included in reverse-engineering options. Skipping...' }, + { message: "'Include stored procedures' is not selected in reverse-engineering options." }, 'Reverse Engineering', ); logger.progress({ - message: 'Skipping discovering stored procedure metadata', + message: 'Skipped: discovering stored procedure', containerName: dbName, entityName: '', });