feat: add scheduler events to analyser

This commit is contained in:
Nybkox
2025-01-02 12:48:28 +01:00
parent ceb6a88964
commit 903297a1e9
5 changed files with 104 additions and 2 deletions

View File

@@ -10,7 +10,16 @@ import { extractErrorLogData } from './stringTools';
const logger = getLogger('dbAnalyser'); const logger = getLogger('dbAnalyser');
const STRUCTURE_FIELDS = ['tables', 'collections', 'views', 'matviews', 'functions', 'procedures', 'triggers']; const STRUCTURE_FIELDS = [
'tables',
'collections',
'views',
'matviews',
'functions',
'procedures',
'triggers',
'schedulerEvents',
];
const fp_pick = arg => array => _pick(array, arg); const fp_pick = arg => array => _pick(array, arg);
@@ -70,7 +79,9 @@ export class DatabaseAnalyser {
} }
async fullAnalysis() { async fullAnalysis() {
logger.debug(`Performing full analysis, DB=${dbNameLogCategory(this.dbhan.database)}, engine=${this.driver.engine}`); logger.debug(
`Performing full analysis, DB=${dbNameLogCategory(this.dbhan.database)}, engine=${this.driver.engine}`
);
const res = this.addEngineField(await this._runAnalysis()); const res = this.addEngineField(await this._runAnalysis());
// console.log('FULL ANALYSIS', res); // console.log('FULL ANALYSIS', res);
return res; return res;
@@ -255,6 +266,7 @@ export class DatabaseAnalyser {
...this.getDeletedObjectsForField(snapshot, 'procedures'), ...this.getDeletedObjectsForField(snapshot, 'procedures'),
...this.getDeletedObjectsForField(snapshot, 'functions'), ...this.getDeletedObjectsForField(snapshot, 'functions'),
...this.getDeletedObjectsForField(snapshot, 'triggers'), ...this.getDeletedObjectsForField(snapshot, 'triggers'),
...this.getDeletedObjectsForField(snapshot, 'schedulerEvents'),
]; ];
} }
@@ -355,6 +367,7 @@ export class DatabaseAnalyser {
functions: [], functions: [],
procedures: [], procedures: [],
triggers: [], triggers: [],
schedulerEvents: [],
}; };
} }

View File

@@ -157,6 +157,20 @@ export interface TriggerInfo extends SqlObjectInfo {
eventType?: 'INSERT' | 'UPDATE' | 'DELETE' | 'TRUNCATE'; eventType?: 'INSERT' | 'UPDATE' | 'DELETE' | 'TRUNCATE';
} }
export interface SchedulerEventInfo extends SqlObjectInfo {
definer: string;
eventType: 'RECURRING' | 'ONE TIME';
onCompletion: 'PRESERVE' | 'NOT PRESERVE';
status: 'ENABLED' | 'DISABLED';
lastExecuted?: string;
intervalValue: number;
intervalField: string;
starts: string;
executeAt: string;
enableSql: string;
disableSql: string;
}
export interface SchemaInfo { export interface SchemaInfo {
objectId?: string; objectId?: string;
schemaName: string; schemaName: string;
@@ -171,6 +185,7 @@ export interface DatabaseInfoObjects {
procedures: ProcedureInfo[]; procedures: ProcedureInfo[];
functions: FunctionInfo[]; functions: FunctionInfo[];
triggers: TriggerInfo[]; triggers: TriggerInfo[];
schedulerEvents: SchedulerEventInfo[];
} }
export interface DatabaseInfo extends DatabaseInfoObjects { export interface DatabaseInfo extends DatabaseInfoObjects {

View File

@@ -164,6 +164,9 @@ class Analyser extends DatabaseAnalyser {
this.feedback({ analysingMessage: 'Loading triggers' }); this.feedback({ analysingMessage: 'Loading triggers' });
const triggers = await this.analyserQuery('triggers'); const triggers = await this.analyserQuery('triggers');
this.feedback({ analysingMessage: 'Loading scehduler events' });
const schedulerEvents = await this.analyserQuery('schedulerEvents');
const uniqueNames = await this.analyserQuery('uniqueNames', ['tables']); const uniqueNames = await this.analyserQuery('uniqueNames', ['tables']);
this.feedback({ analysingMessage: 'Finalizing DB structure' }); this.feedback({ analysingMessage: 'Finalizing DB structure' });
@@ -249,6 +252,23 @@ class Analyser extends DatabaseAnalyser {
tableName: row.tableName, tableName: row.tableName,
createSql: `CREATE TRIGGER ${row.triggerName} ${row.triggerTiming} ${row.eventType} ON ${row.tableName} FOR EACH ROW ${row.definition}`, createSql: `CREATE TRIGGER ${row.triggerName} ${row.triggerTiming} ${row.eventType} ON ${row.tableName} FOR EACH ROW ${row.definition}`,
})), })),
schedulerEvents: schedulerEvents.rows.map(row => ({
contentHash: _.isDate(row.LAST_ALTERED) ? row.LAST_ALTERED.toISOString() : row.LAST_ALTERED,
pureName: row.EVENT_NAME,
createSql: row.CREATE_SQL,
enableSql: row.ENABLE_SQL,
disableSql: row.DISABLE_SQL,
objectId: row.EVENT_NAME,
intervalValue: row.INTERVAL_VALUE,
intervalField: row.INTERVAL_FIELD,
starts: row.STARTS,
status: row.STATUS,
executeAt: row.EXECUTE_AT,
lastExecuted: row.LAST_EXECUTED,
eventType: row.EVENT_TYPE,
definer: row.DEFINER,
objectTypeField: 'schedulerEvents',
})),
}; };
this.feedback({ analysingMessage: null }); this.feedback({ analysingMessage: null });
return res; return res;
@@ -258,6 +278,7 @@ class Analyser extends DatabaseAnalyser {
const tableModificationsQueryData = await this.analyserQuery('tableModifications'); const tableModificationsQueryData = await this.analyserQuery('tableModifications');
const procedureModificationsQueryData = await this.analyserQuery('procedureModifications'); const procedureModificationsQueryData = await this.analyserQuery('procedureModifications');
const functionModificationsQueryData = await this.analyserQuery('functionModifications'); const functionModificationsQueryData = await this.analyserQuery('functionModifications');
const schedulerEvents = await this.analyserQuery('schedulerEvents');
return { return {
tables: tableModificationsQueryData.rows tables: tableModificationsQueryData.rows
@@ -285,6 +306,23 @@ class Analyser extends DatabaseAnalyser {
objectId: x.Name, objectId: x.Name,
pureName: x.Name, pureName: x.Name,
})), })),
schedulerEvents: schedulerEvents.rows.map(row => ({
contentHash: _.isDate(row.LAST_ALTERED) ? row.LAST_ALTERED.toISOString() : row.LAST_ALTERED,
pureName: row.EVENT_NAME,
createSql: row.CREATE_SQL,
enableSql: row.ENABLE_SQL,
disableSql: row.DISABLE_SQL,
objectId: row.EVENT_NAME,
intervalValue: row.INTERVAL_VALUE,
intervalField: row.INTERVAL_FIELD,
starts: row.STARTS,
status: row.STATUS,
executeAt: row.EXECUTE_AT,
lastExecuted: row.LAST_EXECUTED,
eventType: row.EVENT_TYPE,
definer: row.DEFINER,
objectTypeField: 'schedulerEvents',
})),
}; };
} }
} }

View File

@@ -12,6 +12,7 @@ const uniqueNames = require('./uniqueNames');
const viewTexts = require('./viewTexts'); const viewTexts = require('./viewTexts');
const parameters = require('./parameters'); const parameters = require('./parameters');
const triggers = require('./triggers'); const triggers = require('./triggers');
const schedulerEvents = require('./schedulerEvents.js');
module.exports = { module.exports = {
columns, columns,
@@ -28,4 +29,5 @@ module.exports = {
uniqueNames, uniqueNames,
viewTexts, viewTexts,
triggers, triggers,
schedulerEvents,
}; };

View File

@@ -0,0 +1,34 @@
module.exports = `
SELECT
EVENT_SCHEMA,
EVENT_NAME,
DEFINER,
EVENT_TYPE,
EXECUTE_AT,
INTERVAL_VALUE,
INTERVAL_FIELD,
CREATED,
LAST_EXECUTED,
LAST_ALTERED,
STARTS,
ENDS,
STATUS,
ON_COMPLETION,
CONCAT(
'CREATE EVENT ', EVENT_NAME, ' ',
CASE WHEN EVENT_TYPE = 'RECURRING' THEN
'ON SCHEDULE EVERY '
ELSE 'ON SCHEDULE AT '
END,
CASE WHEN EVENT_TYPE = 'RECURRING' THEN
CONCAT(INTERVAL_VALUE, ' ', INTERVAL_FIELD)
ELSE DATE_FORMAT(EXECUTE_AT, '%Y-%m-%d %H:%i:%s')
END,
' DO ',
EVENT_DEFINITION
) AS CREATE_SQL,
CONCAT('ALTER EVENT ', EVENT_NAME, ' DISABLE;') AS DISABLE_SQL,
CONCAT('ALTER EVENT ', EVENT_NAME, ' ENABLE;') AS ENABLE_SQL
FROM INFORMATION_SCHEMA.EVENTS
WHERE EVENT_SCHEMA = '#DATABASE#' AND EVENT_NAME =OBJECT_ID_CONDITION
`;