Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions reverse_engineering/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 5 additions & 0 deletions reverse_engineering/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
]
}
57 changes: 43 additions & 14 deletions reverse_engineering/helpers/postgresService.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -245,6 +261,7 @@ module.exports = {
schemaOid,
schemaName,
userDefinedTypes,
ignoreUdfUdpTriggers,
{ tableName, isParentPartitioned },
) {
logger.progress('Get table data', schemaName, tableName);
Expand All @@ -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);
Expand All @@ -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,
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down