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
1 change: 1 addition & 0 deletions localization/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
31 changes: 28 additions & 3 deletions reverse_engineering/databaseService/databaseService.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 [];
}

Expand Down Expand Up @@ -874,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,
},
Expand Down Expand Up @@ -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: "'Include stored procedures' is not selected in reverse-engineering options." },
'Reverse Engineering',
);
logger.progress({
message: 'Skipped: discovering stored procedure',
containerName: dbName,
entityName: '',
});
return [];
}

const currentDbConnectionClient = await getClient({
client,
dbName,
Expand Down Expand Up @@ -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 = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const getOptionsFromConnectionInfo = connectionInfo => ({
includeEmptyCollection: connectionInfo.includeEmptyCollection,
isFieldOrderAlphabetic: connectionInfo.fieldInference.active === 'alphabetical',
includeProcedures: connectionInfo.includeProcedures || false,
recordSamplingSettings: {
...connectionInfo.recordSamplingSettings,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -285,44 +285,65 @@ 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,
indexesId: rawDatabaseIndexes.map(i => i.index_id),
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({
Expand Down Expand Up @@ -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,
Expand Down