mirror of https://github.com/sysown/proxysql
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
8.3 KiB
308 lines
8.3 KiB
-- EVENTS
|
|
-- ======
|
|
-- >= 5.5
|
|
|
|
USE tap;
|
|
|
|
DELIMITER //
|
|
|
|
/************************************************************************************/
|
|
-- Is the scheduler process running
|
|
|
|
DROP FUNCTION IF EXISTS _scheduler //
|
|
CREATE FUNCTION _scheduler()
|
|
RETURNS VARCHAR(3)
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE ret VARCHAR(3);
|
|
|
|
SELECT @@GLOBAL.event_scheduler INTO ret;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
DROP FUNCTION IF EXISTS scheduler_is //
|
|
CREATE FUNCTION scheduler_is(want VARCHAR(3), description TEXT)
|
|
RETURNS TEXT
|
|
DETERMINISTIC
|
|
BEGIN
|
|
IF description = '' THEN
|
|
SET description = 'Event scheduler process should be correctly set';
|
|
END IF;
|
|
|
|
RETURN eq(_scheduler(), want, description);
|
|
END //
|
|
|
|
|
|
DROP FUNCTION IF EXISTS _has_event //
|
|
CREATE FUNCTION _has_event(sname VARCHAR(64), ename VARCHAR(64))
|
|
RETURNS BOOLEAN
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE ret BOOLEAN;
|
|
|
|
SELECT 1 INTO ret
|
|
FROM `information_schema`.`events`
|
|
WHERE `event_schema` = sname
|
|
AND `event_name` = ename;
|
|
|
|
RETURN COALESCE(ret, 0);
|
|
END //
|
|
|
|
DROP FUNCTION IF EXISTS has_event //
|
|
CREATE FUNCTION has_event(sname VARCHAR(64), ename VARCHAR(64), description TEXT)
|
|
RETURNS TEXT
|
|
DETERMINISTIC
|
|
BEGIN
|
|
IF description = '' THEN
|
|
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' should exist');
|
|
END IF;
|
|
|
|
IF NOT _has_schema(sname) THEN
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
|
|
END IF;
|
|
|
|
RETURN ok(_has_event(sname, ename), description);
|
|
END //
|
|
|
|
|
|
DROP FUNCTION IF EXISTS hasnt_event //
|
|
CREATE FUNCTION hasnt_event(sname VARCHAR(64), ename VARCHAR(64), description TEXT)
|
|
RETURNS TEXT
|
|
DETERMINISTIC
|
|
BEGIN
|
|
IF description = '' THEN
|
|
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' should not exist');
|
|
END IF;
|
|
|
|
IF NOT _has_schema(sname) THEN
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
|
|
END IF;
|
|
|
|
RETURN ok(NOT _has_event(sname, ename), description);
|
|
END //
|
|
|
|
|
|
/****************************************************************************/
|
|
-- EVENT TYPE
|
|
-- { ONE TIME | RECURRING }
|
|
|
|
DROP FUNCTION IF EXISTS _event_type //
|
|
CREATE FUNCTION _event_type(sname VARCHAR(64), ename VARCHAR(64))
|
|
RETURNS VARCHAR(9)
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE ret VARCHAR(9);
|
|
|
|
SELECT `event_type` INTO ret
|
|
FROM `information_schema`.`events`
|
|
WHERE `event_schema` = sname
|
|
AND `event_name` = ename;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
DROP FUNCTION IF EXISTS event_type_is //
|
|
CREATE FUNCTION event_type_is(sname VARCHAR(64), ename VARCHAR(64), etype VARCHAR(9), description TEXT)
|
|
RETURNS TEXT
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE valid ENUM('ONE TIME','RECURRING');
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1265
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag('Event Type must be { ONE TIME | RECURRING }'));
|
|
|
|
IF description = '' THEN
|
|
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' should have Event Type ', qv(etype));
|
|
END IF;
|
|
|
|
SET valid = etype;
|
|
|
|
IF NOT _has_event(sname,ename) THEN
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' does not exist')));
|
|
END IF;
|
|
|
|
RETURN eq(_event_type(sname, ename), etype, description);
|
|
END //
|
|
|
|
|
|
/****************************************************************************/
|
|
-- INTERVAL_VALUE for recurring events
|
|
-- VARCHAR(256) ALLOWS NULL
|
|
-- stores a number as a string!
|
|
|
|
DROP FUNCTION IF EXISTS _event_interval_value //
|
|
CREATE FUNCTION _event_interval_value(sname VARCHAR(64), ename VARCHAR(64))
|
|
RETURNS VARCHAR(256)
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE ret VARCHAR(256);
|
|
|
|
SELECT `interval_value` INTO ret
|
|
FROM `information_schema`.`events`
|
|
WHERE `event_schema` = sname
|
|
AND `event_name` = ename;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
DROP FUNCTION IF EXISTS event_interval_value_is //
|
|
CREATE FUNCTION event_interval_value_is(sname VARCHAR(64), ename VARCHAR(64), ivalue VARCHAR(256), description TEXT)
|
|
RETURNS TEXT
|
|
DETERMINISTIC
|
|
BEGIN
|
|
IF description = '' THEN
|
|
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' should have Interval Value ', qv(ivalue));
|
|
END IF;
|
|
|
|
IF NOT _has_event(sname,ename) THEN
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' does not exist')));
|
|
END IF;
|
|
|
|
RETURN eq(_event_interval_value(sname, ename), ivalue, description);
|
|
END //
|
|
|
|
/****************************************************************************/
|
|
-- INTERVAL_FIELD for recurring events
|
|
-- VARCHAR(18) ALLOWS NULL
|
|
-- HOUR, DAY, WEEK etc
|
|
|
|
DROP FUNCTION IF EXISTS _event_interval_field //
|
|
CREATE FUNCTION _event_interval_field(sname VARCHAR(64), ename VARCHAR(64))
|
|
RETURNS VARCHAR(18)
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE ret VARCHAR(18);
|
|
|
|
SELECT `interval_field` INTO ret
|
|
FROM `information_schema`.`events`
|
|
WHERE `event_schema` = sname
|
|
AND `event_name` = ename;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
DROP FUNCTION IF EXISTS event_interval_field_is //
|
|
CREATE FUNCTION event_interval_field_is(sname VARCHAR(64), ename VARCHAR(64), ifield VARCHAR(18), description TEXT)
|
|
RETURNS TEXT
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE valid ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE ',
|
|
'WEEK','SECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE',
|
|
'DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND');
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1265
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag('Event Interval must be { YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
|
|
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
|
|
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND }'));
|
|
|
|
IF description = '' THEN
|
|
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' should have Interval Field ', qv(ifield));
|
|
END IF;
|
|
|
|
SET valid = ifield;
|
|
|
|
IF NOT _has_event(sname,ename) THEN
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' does not exist')));
|
|
END IF;
|
|
|
|
RETURN eq(_event_interval_field(sname, ename), ifield, description);
|
|
END //
|
|
|
|
|
|
/****************************************************************************/
|
|
-- STATUS
|
|
-- { ENABLED | DISABLED | SLAVESIDE DISABLED }
|
|
|
|
DROP FUNCTION IF EXISTS _event_status //
|
|
CREATE FUNCTION _event_status(sname VARCHAR(64), ename VARCHAR(64))
|
|
RETURNS VARCHAR(18)
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE ret VARCHAR(18);
|
|
|
|
SELECT `status` INTO ret
|
|
FROM `information_schema`.`events`
|
|
WHERE `event_schema` = sname
|
|
AND `event_name` = ename;
|
|
|
|
RETURN ret;
|
|
END //
|
|
|
|
DROP FUNCTION IF EXISTS event_status_is //
|
|
CREATE FUNCTION event_status_is(sname VARCHAR(64), ename VARCHAR(64), stat VARCHAR(18), description TEXT)
|
|
RETURNS TEXT
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE valid ENUM('ENABLED','DISABLED','SLAVESIDE DISABLED');
|
|
|
|
DECLARE CONTINUE HANDLER FOR 1265
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag('Event Status must be { ENABLED | DISABLED | SLAVESIDE DISABLED }'));
|
|
|
|
IF description = '' THEN
|
|
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' should have Status ', qv(stat));
|
|
END IF;
|
|
|
|
SET valid = stat;
|
|
|
|
IF NOT _has_event(sname,ename) THEN
|
|
RETURN CONCAT(ok(FALSE, description), '\n',
|
|
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
|
|
' does not exist')));
|
|
END IF;
|
|
|
|
RETURN eq(_event_status(sname, ename), stat, description);
|
|
END //
|
|
|
|
|
|
/****************************************************************************/
|
|
-- Check that the proper events are defined
|
|
|
|
DROP FUNCTION IF EXISTS events_are //
|
|
CREATE FUNCTION events_are(sname VARCHAR(64), want TEXT, description TEXT)
|
|
RETURNS TEXT
|
|
DETERMINISTIC
|
|
BEGIN
|
|
SET @want = want;
|
|
SET @have = (SELECT GROUP_CONCAT('`',`event_name`,'`')
|
|
FROM `information_schema`.`events`
|
|
WHERE `event_schema` = sname);
|
|
|
|
IF description = '' THEN
|
|
SET description = CONCAT('Schema ', quote_ident(sname), ' should have the correct Events');
|
|
END IF;
|
|
|
|
IF NOT _has_schema(sname) THEN
|
|
RETURN CONCAT( ok(FALSE, description), '\n',
|
|
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist' )));
|
|
END IF;
|
|
|
|
CALL _populate_want(@want);
|
|
CALL _populate_have(@have);
|
|
|
|
SET @missing = (SELECT _missing(@have));
|
|
SET @extras = (SELECT _extra(@want));
|
|
|
|
RETURN _are('events', @extras, @missing, description);
|
|
END //
|
|
|
|
|
|
DELIMITER ;
|