Merge pull request #985 from dbgate/feature/mysql-event-scheduler

Feature/mysql event scheduler
This commit is contained in:
Jan Prochazka
2025-01-07 14:37:30 +01:00
committed by GitHub
16 changed files with 276 additions and 34 deletions

View File

@@ -164,6 +164,9 @@ class Analyser extends DatabaseAnalyser {
this.feedback({ analysingMessage: 'Loading 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']);
this.feedback({ analysingMessage: 'Finalizing DB structure' });
@@ -249,6 +252,21 @@ class Analyser extends DatabaseAnalyser {
tableName: row.tableName,
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,
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 });
return res;
@@ -258,6 +276,7 @@ class Analyser extends DatabaseAnalyser {
const tableModificationsQueryData = await this.analyserQuery('tableModifications');
const procedureModificationsQueryData = await this.analyserQuery('procedureModifications');
const functionModificationsQueryData = await this.analyserQuery('functionModifications');
const schedulerEvents = await this.analyserQuery('schedulerEvents');
return {
tables: tableModificationsQueryData.rows
@@ -285,6 +304,21 @@ class Analyser extends DatabaseAnalyser {
objectId: 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,
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 parameters = require('./parameters');
const triggers = require('./triggers');
const schedulerEvents = require('./schedulerEvents.js');
module.exports = {
columns,
@@ -28,4 +29,5 @@ module.exports = {
uniqueNames,
viewTexts,
triggers,
schedulerEvents,
};

View File

@@ -0,0 +1,32 @@
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
FROM INFORMATION_SCHEMA.EVENTS
WHERE EVENT_SCHEMA = '#DATABASE#' AND EVENT_NAME =OBJECT_ID_CONDITION
`;