From 7053575a9b08360817c5fcd76312e49c6cdf7c98 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Mon, 9 Feb 2026 23:26:36 +0200 Subject: [PATCH 1/3] feat: improved fetching only specified tables --- constants/constants.js | 4 +-- reverse_engineering/api.js | 10 +++---- shared/helpers/instanceHelper.js | 22 ++++++++++----- shared/helpers/queryHelper.js | 48 +++++++++++++++++++------------- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/constants/constants.js b/constants/constants.js index c1d0a82..280731f 100644 --- a/constants/constants.js +++ b/constants/constants.js @@ -6,7 +6,7 @@ const ERROR_MESSAGE = { /** * @enum {string} */ -const TABLE_TYPE = { +const OBJECT_TYPE = { table: 'TABLE', view: 'VIEW', }; @@ -24,7 +24,7 @@ const CONSTRAINT_POSTFIX = { module.exports = { ERROR_MESSAGE, - TABLE_TYPE, + OBJECT_TYPE, INLINE_COMMENT, CONSTRAINT_POSTFIX, }; diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 003f62d..5d53799 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -11,7 +11,7 @@ const { mapSeries } = require('async'); const { connectionHelper } = require('../shared/helpers/connectionHelper'); const { instanceHelper } = require('../shared/helpers/instanceHelper'); const { logHelper } = require('../shared/helpers/logHelper'); -const { TABLE_TYPE } = require('../constants/constants'); +const { OBJECT_TYPE } = require('../constants/constants'); const { nameHelper } = require('../shared/helpers/nameHelper'); const { testConnection } = require('../shared/api/testConnection'); @@ -83,7 +83,7 @@ const getDbCollectionsNames = async (connectionInfo, appLogger, callback, app) = const tableNames = await instanceHelper.getDatabasesWithTableNames({ connection, - tableType: TABLE_TYPE.table, + objectType: OBJECT_TYPE.table, includeSystemCollection: connectionInfo.includeSystemCollection, tableNameModifier: identity, }); @@ -92,7 +92,7 @@ const getDbCollectionsNames = async (connectionInfo, appLogger, callback, app) = const viewNames = await instanceHelper.getDatabasesWithTableNames({ connection, - tableType: TABLE_TYPE.view, + objectType: OBJECT_TYPE.view, includeSystemCollection: connectionInfo.includeSystemCollection, tableNameModifier: nameHelper.setViewSign, }); @@ -153,7 +153,7 @@ const getDbCollectionsData = async (connectionInfo, appLogger, callback, app) => connection, schemaName, tableName, - tableType: TABLE_TYPE.table, + objectType: OBJECT_TYPE.table, logger, }); @@ -185,7 +185,7 @@ const getDbCollectionsData = async (connectionInfo, appLogger, callback, app) => connection, schemaName, tableName: viewName, - tableType: TABLE_TYPE.view, + objectType: OBJECT_TYPE.view, logger, }); diff --git a/shared/helpers/instanceHelper.js b/shared/helpers/instanceHelper.js index 995b8db..65cf34c 100644 --- a/shared/helpers/instanceHelper.js +++ b/shared/helpers/instanceHelper.js @@ -4,7 +4,6 @@ * @typedef {import("../types").Logger} Logger */ -const { TABLE_TYPE } = require('../../constants/constants'); const { queryHelper } = require('./queryHelper'); /** @@ -32,11 +31,11 @@ const getSchemaNames = async ({ connection }) => { }; /** - * @param {{ connection: Connection, tableType: string, includeSystemCollection: boolean, tableNameModifier: (name: string) => string }} + * @param {{ connection: Connection, objectType: string, includeSystemCollection: boolean, tableNameModifier: (name: string) => string }} * @returns {Promise} */ -const getDatabasesWithTableNames = async ({ connection, tableType, includeSystemCollection, tableNameModifier }) => { - const query = queryHelper.getTableNamesQuery({ tableType, includeSystemCollection }); +const getDatabasesWithTableNames = async ({ connection, objectType, includeSystemCollection, tableNameModifier }) => { + const query = queryHelper.getTableNamesQuery({ objectType, includeSystemCollection }); const result = await connection.execute({ query }); return result.reduce((result, { SCHEMANAME, TABLENAME }) => { @@ -73,12 +72,21 @@ const getSchemaProperties = async ({ connection, schemaName, logger }) => { * @param {{ connection: Connection, schemaName: string, tableName: string, tableName: string, logger: Logger}} * @returns {Promise} */ -const getTableDdl = async ({ connection, schemaName, tableName, tableType, logger }) => { +const getTableDdl = async ({ connection, schemaName, tableName, objectType, logger }) => { try { - const generateQuery = queryHelper.getGenerateTableDdlQuery({ schemaName, tableName, tableType }); + const generateQuery = queryHelper.getGenerateTableDdlQuery({ schemaName, tableName, objectType }); + const opToken = await connection.execute({ query: generateQuery, callable: true }); - const selectQuery = queryHelper.getSelectTableDdlQuery({ opToken, tableType }); + + const selectQuery = queryHelper.getSelectTableDdlQuery({ + opToken, + schemaName, + objectName: tableName, + objectType, + }); + const ddlResult = await connection.execute({ query: selectQuery }); + const clearQuery = queryHelper.getClearTableDdlQuery(); await connection.execute({ query: clearQuery, callable: true, inparam: opToken }); diff --git a/shared/helpers/queryHelper.js b/shared/helpers/queryHelper.js index a65b788..27ba0e3 100644 --- a/shared/helpers/queryHelper.js +++ b/shared/helpers/queryHelper.js @@ -1,13 +1,13 @@ -const { TABLE_TYPE } = require('../../constants/constants'); +const { OBJECT_TYPE } = require('../../constants/constants'); /** - * @param {{ query: string }} + * @param {{ query: string }} params * @returns {string} */ const cleanUpQuery = ({ query = '' }) => query.replaceAll(/\s+/g, ' '); /** - * @param {{ query: string, schemaNameKeyword: string }} + * @param {{ query: string, schemaNameKeyword: string }} params * @returns {string} */ const getNonSystemSchemaWhereClause = ({ query, schemaNameKeyword }) => { @@ -43,7 +43,7 @@ const getSchemasQuery = () => { }; /** - * @param {{ schemaName: string }} + * @param {{ schemaName: string }} params * @returns {string} */ const getSchemaQuery = ({ schemaName }) => { @@ -51,11 +51,11 @@ const getSchemaQuery = ({ schemaName }) => { }; /** - * @param {{ tableType: string, includeSystemCollection: boolean }} + * @param {{ objectType: string, includeSystemCollection: boolean }} params * @returns {string} */ -const getTableNamesQuery = ({ tableType, includeSystemCollection }) => { - const baseQuery = `SELECT TABLE_SCHEM AS SCHEMANAME, TABLE_NAME AS TABLENAME FROM SYSIBM.SQLTABLES WHERE TABLE_TYPE = '${tableType}'`; +const getTableNamesQuery = ({ objectType, includeSystemCollection }) => { + const baseQuery = `SELECT TABLE_SCHEM AS SCHEMANAME, TABLE_NAME AS TABLENAME FROM SYSIBM.SQLTABLES WHERE TABLE_TYPE = '${objectType}'`; if (includeSystemCollection) { return baseQuery; @@ -67,27 +67,37 @@ const getTableNamesQuery = ({ tableType, includeSystemCollection }) => { }; /** - * @param {{ schemaName: string, tableName: string, tableType: string }} + * @param {{ schemaName: string, tableName: string, objectType: string }} params * @returns {string}; */ -const getGenerateTableDdlQuery = ({ schemaName, tableName, tableType }) => { - const tableArgument = tableType === TABLE_TYPE.table ? '-t' : '-v'; +const getGenerateTableDdlQuery = ({ schemaName, tableName, objectType }) => { + const objectArgument = objectType === OBJECT_TYPE.table ? '-t' : '-v'; - return `CALL SYSPROC.DB2LK_GENERATE_DDL('-a -e -z "${schemaName}" ${tableArgument} "${tableName}"', ?);`; + return `CALL SYSPROC.DB2LK_GENERATE_DDL('-a -e -z "${schemaName}" ${objectArgument} "${tableName}"', ?);`; }; /** - * @param {{ opToken: number, tableType: string }} + * @param {{ opToken: number, schemaName: string, objectName: string, objectType: string }} params * @returns {string} */ -const getSelectTableDdlQuery = ({ opToken, tableType }) => { - const objectTypeOperator = tableType === TABLE_TYPE.table ? '!=' : '='; +const getSelectTableDdlQuery = ({ opToken, schemaName, objectName, objectType }) => { + const predicate = + objectType === OBJECT_TYPE.view + ? ` + SQL_STMT LIKE '%CREATE%VIEW%"${schemaName}"."${objectName}"%' + OR SQL_STMT LIKE '%COMMENT ON TABLE%"${schemaName}"."${objectName}"%' + ` + : ` + SQL_STMT LIKE '%"${schemaName}"."${objectName}"%' + `; + const query = ` - SELECT SQL_STMT - FROM SYSTOOLS.DB2LOOK_INFO - WHERE OP_TOKEN= ${opToken} - AND OBJ_TYPE ${objectTypeOperator} '${TABLE_TYPE.view}' - ORDER BY CREATION_TIME, OP_SEQUENCE;`; + SELECT SQL_STMT + FROM SYSTOOLS.DB2LOOK_INFO + WHERE OP_TOKEN = ${opToken} + AND ( ${predicate} ) + ORDER BY CREATION_TIME, OP_SEQUENCE + `; return cleanUpQuery({ query }); }; From 73a98318492493405c19cc80c68b0f73eef78d97 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Tue, 10 Feb 2026 00:14:15 +0200 Subject: [PATCH 2/3] fix: fetching views not always returns full path with schema --- shared/helpers/queryHelper.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/shared/helpers/queryHelper.js b/shared/helpers/queryHelper.js index 27ba0e3..a3d6ae4 100644 --- a/shared/helpers/queryHelper.js +++ b/shared/helpers/queryHelper.js @@ -83,13 +83,9 @@ const getGenerateTableDdlQuery = ({ schemaName, tableName, objectType }) => { const getSelectTableDdlQuery = ({ opToken, schemaName, objectName, objectType }) => { const predicate = objectType === OBJECT_TYPE.view - ? ` - SQL_STMT LIKE '%CREATE%VIEW%"${schemaName}"."${objectName}"%' - OR SQL_STMT LIKE '%COMMENT ON TABLE%"${schemaName}"."${objectName}"%' - ` - : ` - SQL_STMT LIKE '%"${schemaName}"."${objectName}"%' - `; + ? `SQL_STMT LIKE 'CREATE%VIEW ${objectName} %' + OR SQL_STMT LIKE 'COMMENT ON TABLE ${objectName}%'` + : `SQL_STMT LIKE '%"${schemaName}"."${objectName}"%'`; const query = ` SELECT SQL_STMT From 44b0dd722264939015bbb30d88f14d0199948e00 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Tue, 10 Feb 2026 00:35:47 +0200 Subject: [PATCH 3/3] fix: removed extra space after view name --- shared/helpers/queryHelper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/helpers/queryHelper.js b/shared/helpers/queryHelper.js index a3d6ae4..b7de0a3 100644 --- a/shared/helpers/queryHelper.js +++ b/shared/helpers/queryHelper.js @@ -83,7 +83,7 @@ const getGenerateTableDdlQuery = ({ schemaName, tableName, objectType }) => { const getSelectTableDdlQuery = ({ opToken, schemaName, objectName, objectType }) => { const predicate = objectType === OBJECT_TYPE.view - ? `SQL_STMT LIKE 'CREATE%VIEW ${objectName} %' + ? `SQL_STMT LIKE 'CREATE%VIEW ${objectName}%' OR SQL_STMT LIKE 'COMMENT ON TABLE ${objectName}%'` : `SQL_STMT LIKE '%"${schemaName}"."${objectName}"%'`;