From 1631573453560fe2cfffe2949e4b53e527ee14b9 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Thu, 10 Nov 2022 11:20:49 +0100 Subject: [PATCH] MT#55881 Provide split_autoprov_firmware_data procedure for upgrades In git rev a9c1cf4cb we had to take care of adjusting the offset variable to support MariaDB >=10.6 in the existing diff/15301.up script. So that also existing installations receive that change during upgrade, let's provide the according script which re-creates the split_autoprov_firmware_data stored procedure. Change-Id: Iae9634b39bda9f1ad63b2b6093f2e6095f68fc45 Thanks: Kirill Solomko --- db_scripts/diff/15743.up | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 db_scripts/diff/15743.up diff --git a/db_scripts/diff/15743.up b/db_scripts/diff/15743.up new file mode 100644 index 00000000..eb7e78fd --- /dev/null +++ b/db_scripts/diff/15743.up @@ -0,0 +1,58 @@ +USE provisioning; +SET autocommit=0; + +CREATE TABLE `autoprov_firmwares_data` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + fw_id int(11) unsigned NOT NULL, + `data` longblob NOT NULL, + PRIMARY KEY (`id`), + KEY `afd_fw_id_idx` (`fw_id`), + CONSTRAINT `fk_fw_idx` FOREIGN KEY (`fw_id`) REFERENCES `autoprov_firmwares` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB; + +DROP PROCEDURE split_autoprov_firmware_data; +DELIMITER ;; +CREATE PROCEDURE split_autoprov_firmware_data() +BEGIN + + DECLARE n_fw_id, chunk_size, off_set int; + DECLARE chunk longblob; + DECLARE done int DEFAULT FALSE; + + DECLARE x CURSOR FOR SELECT id FROM autoprov_firmwares ORDER BY id ASC; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + SET chunk_size = 10485760; + SET off_set = 1; + + OPEN x; + x_main: LOOP + FETCH x INTO n_fw_id; + IF done THEN + LEAVE x_main; + END IF; + SET off_set = 1; + x_chunk: LOOP + SELECT substr(data, off_set, chunk_size) INTO chunk + FROM autoprov_firmwares + WHERE id = n_fw_id; + IF LENGTH(chunk) > 0 THEN + INSERT INTO autoprov_firmwares_data (fw_id, data) + VALUES (n_fw_id, chunk); + SET off_set = off_set+chunk_size; + ELSE + LEAVE x_chunk; + END IF; + END LOOP; + END LOOP; + CLOSE x; + +END;; +DELIMITER ; + +CALL split_autoprov_firmware_data; +DROP PROCEDURE split_autoprov_firmware_data; + +ALTER TABLE autoprov_firmwares DROP data; + +COMMIT;