feat: add object ids to firebird queries

This commit is contained in:
Pavel
2025-05-27 18:49:27 +02:00
parent c20cac621a
commit 1568dfc183
8 changed files with 48 additions and 19 deletions

View File

@@ -16,35 +16,46 @@ class Analyser extends DatabaseAnalyser {
} }
async _runAnalysis() { async _runAnalysis() {
const tablesResult = await this.driver.query(this.dbhan, sql.tables); const tablesResult = await this.analyserQuery(sql.tables, ['tables']);
const columnsResult = await this.driver.query(this.dbhan, sql.columns); const columnsResult = await this.analyserQuery(sql.columns, ['tables', 'views']);
const triggersResult = await this.driver.query(this.dbhan, sql.triggers); const triggersResult = await this.analyserQuery(sql.triggers, ['triggers']);
const primaryKeysResult = await this.driver.query(this.dbhan, sql.primaryKeys); const primaryKeysResult = await this.analyserQuery(sql.primaryKeys, ['primaryKeys']);
const foreignKeysResult = await this.driver.query(this.dbhan, sql.foreignKeys); const foreignKeysResult = await this.analyserQuery(sql.foreignKeys, ['foreignKeys']);
const functionsResults = await this.driver.query(this.dbhan, sql.functions); const functionsResults = await this.analyserQuery(sql.functions, ['functions']);
const functionParametersResults = await this.driver.query(this.dbhan, sql.functionParameters); const functionParametersResults = await this.analyserQuery(sql.functionParameters, ['functions']);
const proceduresResults = await this.driver.query(this.dbhan, sql.procedures); const proceduresResults = await this.analyserQuery(sql.procedures, ['procedures']);
const procedureParametersResults = await this.driver.query(this.dbhan, sql.procedureParameters); const procedureParametersResults = await this.analyserQuery(sql.procedureParameters, ['procedures']);
const columns = columnsResult.rows?.map(column => ({ const columns = columnsResult.rows?.map(column => ({
...column, ...column,
objectId: `tables:${column.columnName}`,
dataType: getDataTypeString(column), dataType: getDataTypeString(column),
defaultValue: getFormattedDefaultValue(column.defaultValue), defaultValue: getFormattedDefaultValue(column.defaultValue),
})); }));
const triggers = triggersResult.rows?.map(i => ({ const triggers = triggersResult.rows?.map(i => ({
...i, ...i,
objectId: `triggers:${i.pureName}`,
eventType: getTriggerEventType(i.TRIGGERTYPE), eventType: getTriggerEventType(i.TRIGGERTYPE),
triggerTiming: getTriggerTiming(i.TRIGGERTYPE), triggerTiming: getTriggerTiming(i.TRIGGERTYPE),
createSql: getTriggerCreateSql(i), createSql: getTriggerCreateSql(i),
})); }));
const primaryKeys = primaryKeysResult.rows ?? []; const primaryKeys =
primaryKeysResult.rows?.map(primaryKey => ({
...primaryKey,
objectId: `tables:${primaryKey.pureName}`,
})) ?? [];
const foreignKeys = foreignKeysResult.rows ?? []; const foreignKeys =
foreignKeysResult.rows?.map(foreignKey => ({
...foreignKey,
objectId: `tables:${foreignKey.pureName}`,
})) ?? [];
const functions = functionsResults.rows?.map(func => ({ const functions = functionsResults.rows?.map(func => ({
...func, ...func,
objectId: `functions:${func.pureName}`,
returnType: functionParametersResults.rows?.filter( returnType: functionParametersResults.rows?.filter(
param => param.owningObjectName === func.pureName && param.parameterMode === 'RETURN' param => param.owningObjectName === func.pureName && param.parameterMode === 'RETURN'
)?.dataType, )?.dataType,
@@ -58,6 +69,7 @@ class Analyser extends DatabaseAnalyser {
const procedures = proceduresResults.rows.map(proc => ({ const procedures = proceduresResults.rows.map(proc => ({
...proc, ...proc,
objectId: `procedures:${proc.pureName}`,
parameters: procedureParametersResults.rows parameters: procedureParametersResults.rows
?.filter(param => param.owningObjectName === proc.pureName) ?.filter(param => param.owningObjectName === proc.pureName)
.map(param => ({ .map(param => ({
@@ -69,6 +81,7 @@ class Analyser extends DatabaseAnalyser {
const tables = const tables =
tablesResult.rows?.map(table => ({ tablesResult.rows?.map(table => ({
...table, ...table,
objectId: `tables:${table.pureName}`,
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),
@@ -81,6 +94,12 @@ class Analyser extends DatabaseAnalyser {
procedures, procedures,
}; };
} }
async _computeSingleObjectId() {
const { typeField, pureName } = this.singleObjectFilter;
console.log('Computing single object ID for', typeField, pureName);
this.singleObjectId = `${typeField}:${pureName}`;
}
} }
module.exports = Analyser; module.exports = Analyser;

View File

@@ -37,6 +37,8 @@ LEFT JOIN
rdb$collations co ON f.rdb$collation_id = co.rdb$collation_id rdb$collations co ON f.rdb$collation_id = co.rdb$collation_id
WHERE WHERE
r.rdb$system_flag = 0 r.rdb$system_flag = 0
AND
('columns:' || CAST(TRIM(rf.rdb$field_name) AS VARCHAR(255))) =OBJECT_ID_CONDITION
ORDER BY ORDER BY
"tableName", rf.rdb$field_position; "tableName", rf.rdb$field_position;
`; `;

View File

@@ -27,6 +27,8 @@ JOIN
AND iseg_fk.RDB$FIELD_POSITION = iseg_pk.RDB$FIELD_POSITION -- Critical for matching columns in composite keys AND iseg_fk.RDB$FIELD_POSITION = iseg_pk.RDB$FIELD_POSITION -- Critical for matching columns in composite keys
WHERE WHERE
rc_fk.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' rc_fk.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
AND
('tables:' || TRIM(rc_fk.RDB$RELATION_NAME)) =OBJECT_ID_CONDITION
ORDER BY ORDER BY
"pureName", "pureName",
"constraintName", "constraintName",

View File

@@ -10,6 +10,7 @@ FROM
RDB$FUNCTIONS F RDB$FUNCTIONS F
WHERE WHERE
COALESCE(F.RDB$SYSTEM_FLAG, 0) = 0 -- User-defined functions COALESCE(F.RDB$SYSTEM_FLAG, 0) = 0 -- User-defined functions
AND ('funcitons:' || TRIM(F.RDB$FUNCTION_NAME)) =OBJECT_ID_CONDITION
ORDER BY ORDER BY
"pureName"; "pureName";
`; `;

View File

@@ -20,6 +20,7 @@ JOIN
WHERE WHERE
rc.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' rc.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
AND COALESCE(rel.RDB$SYSTEM_FLAG, 0) = 0 -- Typically, you only want user-defined tables AND COALESCE(rel.RDB$SYSTEM_FLAG, 0) = 0 -- Typically, you only want user-defined tables
AND ('tables:' || TRIM(rc.RDB$RELATION_NAME)) =OBJECT_ID_CONDITION
ORDER BY ORDER BY
"pureName", "pureName",
"constraintName", "constraintName",

View File

@@ -1,7 +1,6 @@
module.exports = ` module.exports = `
SELECT SELECT
TRIM(P.RDB$PROCEDURE_NAME) AS "pureName", TRIM(P.RDB$PROCEDURE_NAME) AS "pureName",
TRIM(P.RDB$PROCEDURE_NAME) AS "objectId", -- Using procedure name as a practical objectId
TRIM('PROCEDURE') AS "objectTypeField", TRIM('PROCEDURE') AS "objectTypeField",
TRIM(P.RDB$DESCRIPTION) AS "objectComment", TRIM(P.RDB$DESCRIPTION) AS "objectComment",
P.RDB$PROCEDURE_SOURCE AS "createSql", -- Contains the PSQL body P.RDB$PROCEDURE_SOURCE AS "createSql", -- Contains the PSQL body
@@ -11,6 +10,7 @@ FROM
WHERE WHERE
COALESCE(P.RDB$SYSTEM_FLAG, 0) = 0 -- Filter for user-defined procedures COALESCE(P.RDB$SYSTEM_FLAG, 0) = 0 -- Filter for user-defined procedures
AND P.RDB$PROCEDURE_TYPE IS NOT NULL -- Ensure it's a valid procedure type (0, 1, or 2) AND P.RDB$PROCEDURE_TYPE IS NOT NULL -- Ensure it's a valid procedure type (0, 1, or 2)
AND ('procedures:' || TRIM(P.RDB$PROCEDURE_NAME)) =OBJECT_ID_CONDITION
ORDER BY ORDER BY
"pureName"; "pureName";
`; `;

View File

@@ -1,9 +1,12 @@
module.exports = ` module.exports = `SELECT
SELECT
TRIM(RDB$RELATION_NAME) AS "pureName", TRIM(RDB$RELATION_NAME) AS "pureName",
RDB$DESCRIPTION AS "objectComment", RDB$DESCRIPTION AS "objectComment",
RDB$FORMAT AS "objectTypeField" RDB$FORMAT AS "objectTypeField"
FROM RDB$RELATIONS FROM
WHERE RDB$SYSTEM_FLAG = 0 -- only user-defined tables RDB$RELATIONS
ORDER BY "pureName"; WHERE
`; RDB$SYSTEM_FLAG = 0 -- only user-defined tables
AND
('tables:' || TRIM(RDB$RELATION_NAME)) =OBJECT_ID_CONDITION
ORDER BY
"pureName";`;

View File

@@ -8,5 +8,6 @@ FROM
RDB$TRIGGERS rtr RDB$TRIGGERS rtr
JOIN RDB$RELATIONS rel ON rtr.RDB$RELATION_NAME = rel.RDB$RELATION_NAME JOIN RDB$RELATIONS rel ON rtr.RDB$RELATION_NAME = rel.RDB$RELATION_NAME
WHERE rtr.RDB$SYSTEM_FLAG = 0 WHERE rtr.RDB$SYSTEM_FLAG = 0
AND ('triggers:' || TRIM(rtr.RDB$TRIGGER_NAME)) =OBJECT_ID_CONDITION
ORDER BY rtr.RDB$TRIGGER_NAME ORDER BY rtr.RDB$TRIGGER_NAME
`; `;