mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-29 02:56:01 +00:00
feat: add scheduler events to analyser
This commit is contained in:
@@ -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: [],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
15
packages/types/dbinfo.d.ts
vendored
15
packages/types/dbinfo.d.ts
vendored
@@ -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 {
|
||||||
|
|||||||
@@ -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',
|
||||||
|
})),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
|
`;
|
||||||
Reference in New Issue
Block a user