salix/db/routines/stock/procedures/stock_refreshAll.sql

91 lines
1.7 KiB
MySQL
Raw Normal View History

DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`stock_refreshAll`()
BEGIN
/**
* Recalculates the entire cache. It takes a considerable time,
* please avoid calls to this procedure from commonly used operations.
*/
2025-02-25 11:46:21 +00:00
DECLARE vDone BOOL;
DECLARE vId INT;
DECLARE vEntries CURSOR FOR
SELECT DISTINCT e.id
FROM vn.buy b
JOIN vn.entry e ON b.entryFk = e.id
WHERE b.isAlive;
2025-02-25 11:46:21 +00:00
DECLARE vTickets CURSOR FOR
SELECT id FROM vn.ticket WHERE isAlive;
2025-02-25 11:46:21 +00:00
DECLARE vOrderRows CURSOR FOR
SELECT lotFk FROM hedera.orderRow WHERE isReserved;
2025-02-25 11:46:21 +00:00
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK('stock.stock_refreshAll');
RESIGNAL;
END;
IF NOT GET_LOCK('stock.stock_refreshAll', 30) THEN
CALL util.throw('Lock timeout exceeded');
END IF;
2025-02-25 11:46:21 +00:00
-- Prune cache
2025-02-25 09:49:58 +00:00
DELETE p FROM buyPick p JOIN buyLot l USING(lotFk);
2025-02-18 14:58:38 +00:00
TRUNCATE TABLE buyLot;
TRUNCATE TABLE buyOut;
-- Populate cache
2025-02-25 11:46:21 +00:00
OPEN vEntries;
2025-02-25 11:46:21 +00:00
buyLoop: LOOP
SET vDone = FALSE;
FETCH vEntries INTO vId;
2025-02-25 11:46:21 +00:00
IF vDone THEN
LEAVE buyLoop;
END IF;
CALL buyOut_refreshBuy('entry', vId);
2025-02-25 11:46:21 +00:00
END LOOP;
CLOSE vEntries;
2025-02-25 11:46:21 +00:00
OPEN vOrderRows;
2025-02-25 11:46:21 +00:00
orderLoop: LOOP
SET vDone = FALSE;
FETCH vOrderRows INTO vId;
2025-02-25 11:46:21 +00:00
IF vDone THEN
LEAVE orderLoop;
END IF;
CALL buyOut_refreshOrder('lot', vId);
END LOOP;
CLOSE vOrderRows;
2025-02-25 11:46:21 +00:00
OPEN vTickets;
saleLoop: LOOP
SET vDone = FALSE;
FETCH vTickets INTO vId;
IF vDone THEN
LEAVE saleLoop;
END IF;
CALL buyOut_refreshSale('ticket', vId);
END LOOP;
CLOSE vTickets;
-- Synchronize
2025-02-18 14:58:38 +00:00
UPDATE buyOut SET isSync = TRUE;
CALL stock_sync;
DO RELEASE_LOCK('stock.stock_refreshAll');
END$$
DELIMITER ;