feat: add uniques to firebird

This commit is contained in:
Pavel
2025-05-29 14:52:44 +02:00
parent 9a69f1108d
commit a5adfb7c7f
3 changed files with 81 additions and 36 deletions

View File

@@ -26,21 +26,24 @@ class Analyser extends DatabaseAnalyser {
const proceduresResults = await this.analyserQuery(sql.procedures, ['procedures']); const proceduresResults = await this.analyserQuery(sql.procedures, ['procedures']);
const procedureParametersResults = await this.analyserQuery(sql.procedureParameters, ['procedures']); const procedureParametersResults = await this.analyserQuery(sql.procedureParameters, ['procedures']);
const viewsResults = await this.analyserQuery(sql.views, ['views']); const viewsResults = await this.analyserQuery(sql.views, ['views']);
const unqiuesResults = await this.analyserQuery(sql.uniques, ['tables']);
const columns = columnsResult.rows?.map(column => ({ const columns =
...column, columnsResult.rows?.map(column => ({
objectId: `tables:${column.columnName}`, ...column,
dataType: getDataTypeString(column), objectId: `tables:${column.columnName}`,
defaultValue: getFormattedDefaultValue(column.defaultValue), dataType: getDataTypeString(column),
})); defaultValue: getFormattedDefaultValue(column.defaultValue),
})) ?? [];
const triggers = triggersResult.rows?.map(i => ({ const triggers =
...i, triggersResult.rows?.map(i => ({
objectId: `triggers:${i.pureName}`, ...i,
eventType: getTriggerEventType(i.TRIGGERTYPE), objectId: `triggers:${i.pureName}`,
triggerTiming: getTriggerTiming(i.TRIGGERTYPE), eventType: getTriggerEventType(i.TRIGGERTYPE),
createSql: getTriggerCreateSql(i), triggerTiming: getTriggerTiming(i.TRIGGERTYPE),
})); createSql: getTriggerCreateSql(i),
})) ?? [];
const primaryKeys = const primaryKeys =
primaryKeysResult.rows?.map(primaryKey => ({ primaryKeysResult.rows?.map(primaryKey => ({
@@ -54,30 +57,45 @@ class Analyser extends DatabaseAnalyser {
objectId: `tables:${foreignKey.pureName}`, objectId: `tables:${foreignKey.pureName}`,
})) ?? []; })) ?? [];
const functions = functionsResults.rows?.map(func => ({ const functions =
...func, functionsResults.rows?.map(func => ({
objectId: `functions:${func.pureName}`, ...func,
returnType: functionParametersResults.rows?.filter( objectId: `functions:${func.pureName}`,
param => param.owningObjectName === func.pureName && param.parameterMode === 'RETURN' returnType: functionParametersResults.rows?.filter(
)?.dataType, param => param.owningObjectName === func.pureName && param.parameterMode === 'RETURN'
parameters: functionParametersResults.rows )?.dataType,
?.filter(param => param.owningObjectName === func.pureName) parameters: functionParametersResults.rows
.map(param => ({ ?.filter(param => param.owningObjectName === func.pureName)
...param, .map(param => ({
dataType: getDataTypeString(param), ...param,
})), dataType: getDataTypeString(param),
})); })),
})) ?? [];
const procedures = proceduresResults.rows.map(proc => ({ const uniques =
...proc, unqiuesResults.rows?.map(unique => ({
objectId: `procedures:${proc.pureName}`, pureName: unique.pureName,
parameters: procedureParametersResults.rows constraintName: unique.constraintName,
?.filter(param => param.owningObjectName === proc.pureName) constraintType: unique.constraintType,
.map(param => ({ columns: [
...param, {
dataType: getDataTypeString(param), columnName: unique.columnName,
})), isDescending: unique.isDescending,
})); },
],
})) ?? [];
const procedures =
proceduresResults.rows?.map(proc => ({
...proc,
objectId: `procedures:${proc.pureName}`,
parameters: procedureParametersResults.rows
?.filter(param => param.owningObjectName === proc.pureName)
.map(param => ({
...param,
dataType: getDataTypeString(param),
})),
})) ?? [];
const tables = const tables =
tablesResult.rows?.map(table => ({ tablesResult.rows?.map(table => ({
@@ -86,7 +104,9 @@ class Analyser extends DatabaseAnalyser {
columns: columns.filter(column => column.tableName === table.pureName), columns: columns.filter(column => column.tableName === table.pureName),
primaryKey: DatabaseAnalyser.extractPrimaryKeys(table, primaryKeys), primaryKey: DatabaseAnalyser.extractPrimaryKeys(table, primaryKeys),
foreignKeys: DatabaseAnalyser.extractForeignKeys(table, foreignKeys), foreignKeys: DatabaseAnalyser.extractForeignKeys(table, foreignKeys),
uniques: uniques.filter(unique => unique.pureName === table.pureName),
})) ?? []; })) ?? [];
console.log(uniques);
const views = const views =
viewsResults.rows?.map(view => ({ viewsResults.rows?.map(view => ({

View File

@@ -9,6 +9,7 @@ const functionParameters = require('./functionParameters');
const procedures = require('./procedures'); const procedures = require('./procedures');
const procedureParameters = require('./procedureParameters'); const procedureParameters = require('./procedureParameters');
const views = require('./views'); const views = require('./views');
const uniques = require('./uniques');
module.exports = { module.exports = {
version, version,
@@ -22,4 +23,5 @@ module.exports = {
functionParameters, functionParameters,
procedures, procedures,
procedureParameters, procedureParameters,
uniques,
}; };

View File

@@ -0,0 +1,23 @@
module.exports = `
SELECT
TRIM(rc.RDB$CONSTRAINT_NAME) AS "constraintName", -- Name of the constraint
TRIM('unique') AS "constraintType", -- Type of the constraint
TRIM(rc.RDB$RELATION_NAME) AS "pureName", -- Context: Table the constraint is on
-- Column specific fields from RDB$INDEX_SEGMENTS for the backing index
TRIM(s.RDB$FIELD_NAME) AS "columnName", -- Name of the column in the unique key
CASE COALESCE(i.RDB$INDEX_TYPE, 0) -- isDescending: 0 for ASC (default), 1 for DESC for the backing index
WHEN 1 THEN TRUE
ELSE FALSE
END AS "isDescending"
FROM
RDB$RELATION_CONSTRAINTS rc
JOIN
-- RDB$INDEX_NAME in RDB$RELATION_CONSTRAINTS is the name of the index that enforces the UNIQUE constraint
RDB$INDICES i ON rc.RDB$INDEX_NAME = i.RDB$INDEX_NAME
JOIN
RDB$INDEX_SEGMENTS s ON i.RDB$INDEX_NAME = s.RDB$INDEX_NAME
WHERE
rc.RDB$CONSTRAINT_TYPE = 'UNIQUE' -- Filter for UNIQUE constraints
AND COALESCE(i.RDB$SYSTEM_FLAG, 0) = 0 -- Typically, backing indexes for user UQ constraints are user-related.
`;