124 lines
2.3 KiB
MySQL
124 lines
2.3 KiB
MySQL
|
DELIMITER $$
|
||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`log_sync`(vSync BOOL)
|
||
|
proc: BEGIN
|
||
|
DECLARE vDone BOOL;
|
||
|
DECLARE vLogId INT;
|
||
|
DECLARE vHasPendingSync BOOL;
|
||
|
DECLARE vOperation VARCHAR(255);
|
||
|
DECLARE vTableName VARCHAR(255);
|
||
|
DECLARE vTableId VARCHAR(255);
|
||
|
DECLARE vInboundFk INT;
|
||
|
DECLARE vOutboundFk INT;
|
||
|
|
||
|
DECLARE cInbound CURSOR FOR
|
||
|
SELECT id FROM inbound
|
||
|
WHERE !isSync
|
||
|
ORDER BY dated;
|
||
|
|
||
|
DECLARE cOutbound CURSOR FOR
|
||
|
SELECT id FROM outbound
|
||
|
WHERE !isSync
|
||
|
ORDER BY dated;
|
||
|
|
||
|
DECLARE CONTINUE HANDLER FOR NOT FOUND
|
||
|
SET vDone = TRUE;
|
||
|
|
||
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||
|
BEGIN
|
||
|
ROLLBACK;
|
||
|
RESIGNAL;
|
||
|
END;
|
||
|
|
||
|
-- Applies changes
|
||
|
|
||
|
opsLoop: LOOP
|
||
|
START TRANSACTION;
|
||
|
|
||
|
SET vDone = FALSE;
|
||
|
SELECT id, operation, tableName, tableId
|
||
|
INTO vLogId, vOperation, vTableName, vTableId
|
||
|
FROM `log`
|
||
|
ORDER BY id LIMIT 1
|
||
|
FOR UPDATE;
|
||
|
|
||
|
IF vDone THEN
|
||
|
COMMIT;
|
||
|
LEAVE opsLoop;
|
||
|
END IF;
|
||
|
|
||
|
CALL log_delete(vTableName, vTableId);
|
||
|
|
||
|
IF vOperation = 'insert' THEN
|
||
|
IF vTableName IN ('travel', 'entry', 'buy') THEN
|
||
|
CALL log_refreshBuy(vTableName, vTableId);
|
||
|
ELSEIF vTableName IN ('ticket', 'sale') THEN
|
||
|
CALL log_refreshSale(vTableName, vTableId);
|
||
|
ELSEIF vTableName IN ('order', 'orderRow') THEN
|
||
|
CALL log_refreshOrder(vTableName, vTableId);
|
||
|
END IF;
|
||
|
END IF;
|
||
|
|
||
|
DELETE FROM `log` WHERE id = vLogId;
|
||
|
SET vSync = TRUE;
|
||
|
|
||
|
COMMIT;
|
||
|
END LOOP;
|
||
|
|
||
|
IF !vSync THEN
|
||
|
LEAVE proc;
|
||
|
END IF;
|
||
|
|
||
|
-- Deletes expired outbounds
|
||
|
|
||
|
DELETE FROM outbound WHERE expired <= util.VN_NOW();
|
||
|
|
||
|
-- Attaches desync inbounds
|
||
|
|
||
|
REPEAT
|
||
|
OPEN cInbound;
|
||
|
SET vHasPendingSync = FALSE;
|
||
|
|
||
|
inboundLoop: LOOP
|
||
|
SET vDone = FALSE;
|
||
|
FETCH cInbound INTO vInboundFk;
|
||
|
|
||
|
IF vDone THEN
|
||
|
LEAVE inboundLoop;
|
||
|
END IF;
|
||
|
|
||
|
START TRANSACTION;
|
||
|
CALL inbound_sync(vInboundFk);
|
||
|
COMMIT;
|
||
|
|
||
|
SET vHasPendingSync = TRUE;
|
||
|
END LOOP;
|
||
|
|
||
|
CLOSE cInbound;
|
||
|
UNTIL !vHasPendingSync END REPEAT;
|
||
|
|
||
|
-- Attaches desync outbounds
|
||
|
|
||
|
REPEAT
|
||
|
OPEN cOutbound;
|
||
|
SET vHasPendingSync = FALSE;
|
||
|
|
||
|
outboundLoop: LOOP
|
||
|
SET vDone = FALSE;
|
||
|
FETCH cOutbound INTO vOutboundFk;
|
||
|
|
||
|
IF vDone THEN
|
||
|
LEAVE outboundLoop;
|
||
|
END IF;
|
||
|
|
||
|
START TRANSACTION;
|
||
|
CALL outbound_sync(vOutboundFk);
|
||
|
COMMIT;
|
||
|
|
||
|
SET vHasPendingSync = TRUE;
|
||
|
END LOOP;
|
||
|
|
||
|
CLOSE cOutbound;
|
||
|
UNTIL !vHasPendingSync END REPEAT;
|
||
|
END$$
|
||
|
DELIMITER ;
|