salix/db/routines/bs/procedures/nightTask_launchAll.sql

81 lines
1.7 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`nightTask_launchAll`()
BEGIN
/**
* Runs all nightly tasks.
*/
DECLARE vDone BOOL;
DECLARE vError VARCHAR(255);
DECLARE vErrorCode VARCHAR(255);
DECLARE vSchema VARCHAR(255);
DECLARE vProcedure VARCHAR(255);
DECLARE vLogMail VARCHAR(255);
DECLARE vNightTaskFk INT;
DECLARE vQueue CURSOR FOR
SELECT id, `schema`, `procedure`
FROM nightTask
WHERE finished <= util.VN_CURDATE()
OR finished IS NULL
ORDER BY `order`;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SET max_sp_recursion_depth = 3;
SELECT logMail INTO vLogMail
FROM nightTaskConfig LIMIT 1;
OPEN vQueue;
l: LOOP
SET vDone = FALSE;
FETCH vQueue INTO vNightTaskFk, vSchema, vProcedure;
IF vDone THEN
LEAVE l;
END IF;
UPDATE nightTask
SET `started` = util.VN_NOW(),
`finished` = NULL,
`error` = NULL,
`errorCode` = NULL
WHERE id = vNightTaskFk;
SET vError = NULL;
CALL nightTask_launchTask(
vSchema,
vProcedure,
vError,
vErrorCode
);
IF vError IS NOT NULL THEN
IF vLogMail IS NOT NULL THEN
CALL vn.mail_insert(
vLogMail,
NULL,
CONCAT('Nightly task failed (', vSchema, '.', vProcedure, ')'),
CONCAT(
'[', vErrorCode, '] ', vError, CHAR(13, 10), -- Line break
'See ', SCHEMA(), '.nightTask table for more info.'
)
);
END IF;
UPDATE nightTask
SET `error` = vError,
`errorCode` = vErrorCode
WHERE id = vNightTaskFk;
ELSE
UPDATE nightTask
SET finished = util.VN_NOW(),
lastFinished = util.VN_NOW()
WHERE id = vNightTaskFk;
END IF;
END LOOP;
CLOSE vQueue;
END$$
DELIMITER ;