Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled
216 lines
10 KiB
SQL
216 lines
10 KiB
SQL
-- Migration: Inhalte aus chastity_game_set in die normalen Aufgabengruppen-Tabellen übernehmen.
|
||
--
|
||
-- Jedes chastity_game_set eines Users wird zu einer privaten CHASTITY_ONLY-Aufgabengruppe:
|
||
-- aufgaben (JSON) → aufgabe + aufgabe_benoetigt_passiv
|
||
-- zeitstrafen (JSON) → sperre + sperre_sperre_fuer
|
||
-- finisher (JSON) → finisher
|
||
--
|
||
-- Die Prozedur prüft zuerst, ob chastity_game_set existiert – auf leeren Datenbanken
|
||
-- ist sie dadurch ein No-op.
|
||
|
||
DROP PROCEDURE IF EXISTS proc_migrate_chastity_game_set;
|
||
|
||
CREATE PROCEDURE proc_migrate_chastity_game_set()
|
||
BEGIN
|
||
DECLARE v_set_id VARCHAR(36);
|
||
DECLARE v_owner_id VARCHAR(36);
|
||
DECLARE v_set_name VARCHAR(255);
|
||
DECLARE v_user_name VARCHAR(255);
|
||
DECLARE v_aufgaben_json TEXT;
|
||
DECLARE v_zeitstr_json TEXT;
|
||
DECLARE v_finisher_json TEXT;
|
||
|
||
DECLARE v_gruppe_id VARCHAR(36);
|
||
DECLARE v_aufgabe_id VARCHAR(36);
|
||
DECLARE v_sperre_id VARCHAR(36);
|
||
DECLARE v_finisher_id VARCHAR(36);
|
||
|
||
DECLARE v_outer_count INT;
|
||
DECLARE v_inner_count INT;
|
||
DECLARE i INT;
|
||
DECLARE j INT;
|
||
|
||
DECLARE tbl_exists INT DEFAULT 0;
|
||
DECLARE done INT DEFAULT FALSE;
|
||
|
||
DECLARE cur CURSOR FOR
|
||
SELECT id, owner_id, name, aufgaben, zeitstrafen, finisher
|
||
FROM chastity_game_set;
|
||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
|
||
|
||
-- Add columns that may not yet exist (Hibernate ddl-auto runs after Flyway)
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'aufgabe' AND COLUMN_NAME = 'level') THEN
|
||
ALTER TABLE aufgabe ADD COLUMN level INT NULL;
|
||
END IF;
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sperre' AND COLUMN_NAME = 'level') THEN
|
||
ALTER TABLE sperre ADD COLUMN level INT NULL;
|
||
END IF;
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sperre' AND COLUMN_NAME = 'temp_unlock_before_required') THEN
|
||
ALTER TABLE sperre ADD COLUMN temp_unlock_before_required TINYINT(1) NULL;
|
||
END IF;
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sperre' AND COLUMN_NAME = 'temp_unlock_after_required') THEN
|
||
ALTER TABLE sperre ADD COLUMN temp_unlock_after_required TINYINT(1) NULL;
|
||
END IF;
|
||
|
||
SELECT COUNT(*) INTO tbl_exists
|
||
FROM information_schema.TABLES
|
||
WHERE TABLE_SCHEMA = DATABASE()
|
||
AND TABLE_NAME = 'chastity_game_set';
|
||
|
||
IF tbl_exists > 0 THEN
|
||
|
||
OPEN cur;
|
||
|
||
set_loop: LOOP
|
||
FETCH cur INTO v_set_id, v_owner_id, v_set_name,
|
||
v_aufgaben_json, v_zeitstr_json, v_finisher_json;
|
||
IF done THEN LEAVE set_loop; END IF;
|
||
|
||
SELECT name INTO v_user_name
|
||
FROM user
|
||
WHERE user_id = v_owner_id
|
||
LIMIT 1;
|
||
|
||
SET v_gruppe_id = UUID();
|
||
|
||
-- ── Aufgabengruppe anlegen ───────────────────────────────────────
|
||
INSERT INTO aufgaben_gruppe
|
||
(gruppen_id, name, beschreibung, user_id, private_gruppe, bild, von, available_in)
|
||
VALUES
|
||
(v_gruppe_id,
|
||
v_set_name,
|
||
'Importiert aus Chastity Game Set',
|
||
v_owner_id,
|
||
TRUE,
|
||
NULL,
|
||
v_user_name,
|
||
'CHASTITY_ONLY');
|
||
|
||
-- ── Aufgaben ────────────────────────────────────────────────────
|
||
-- GameSetAufgabe.minutes → sekunden_von / sekunden_bis (× 60)
|
||
-- GameSetAufgabe.benoetigt → aufgabe_benoetigt_passiv
|
||
SET v_outer_count = IFNULL(JSON_LENGTH(v_aufgaben_json), 0);
|
||
SET i = 0;
|
||
WHILE i < v_outer_count DO
|
||
SET v_aufgabe_id = UUID();
|
||
|
||
INSERT INTO aufgabe
|
||
(aufgabe_id, kurz_text, text, level, sekunden_von, sekunden_bis, gruppe_id)
|
||
VALUES (
|
||
v_aufgabe_id,
|
||
JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].title'))),
|
||
JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].description'))),
|
||
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].level'))), 'null') AS SIGNED),
|
||
CASE
|
||
WHEN JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].minutes')) IS NOT NULL
|
||
THEN CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].minutes'))), 'null') AS SIGNED) * 60
|
||
ELSE NULL
|
||
END,
|
||
CASE
|
||
WHEN JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].minutes')) IS NOT NULL
|
||
THEN CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].minutes'))), 'null') AS SIGNED) * 60
|
||
ELSE NULL
|
||
END,
|
||
v_gruppe_id
|
||
);
|
||
|
||
SET v_inner_count = IFNULL(
|
||
JSON_LENGTH(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].benoetigt'))),
|
||
0);
|
||
SET j = 0;
|
||
WHILE j < v_inner_count DO
|
||
SET @wz = NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json,
|
||
CONCAT('$[', i, '].benoetigt[', j, ']'))), 'null');
|
||
IF @wz IS NOT NULL AND @wz != '' THEN
|
||
INSERT IGNORE INTO aufgabe_benoetigt_passiv (aufgabe_id, werkzeug)
|
||
VALUES (v_aufgabe_id, @wz);
|
||
END IF;
|
||
SET j = j + 1;
|
||
END WHILE;
|
||
|
||
SET i = i + 1;
|
||
END WHILE;
|
||
|
||
-- ── Zeitstrafen → Sperren ────────────────────────────────────────
|
||
-- GameSetZeitstrafe.minMinutes / maxMinutes → minuten_von / minuten_bis
|
||
-- GameSetZeitstrafe.level / tempUnlock* → level / temp_unlock_before/after_required
|
||
-- GameSetZeitstrafe.sperrt → sperre_sperre_fuer
|
||
SET v_outer_count = IFNULL(JSON_LENGTH(v_zeitstr_json), 0);
|
||
SET i = 0;
|
||
WHILE i < v_outer_count DO
|
||
SET v_sperre_id = UUID();
|
||
|
||
INSERT INTO sperre
|
||
(sperre_id, kurz_text, text, release_text, minuten_von, minuten_bis,
|
||
level, temp_unlock_before_required, temp_unlock_after_required, gruppe_id)
|
||
VALUES (
|
||
v_sperre_id,
|
||
JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].title'))),
|
||
JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].description'))),
|
||
IF(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].releaseText')) IS NOT NULL,
|
||
JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].releaseText'))),
|
||
NULL),
|
||
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].minMinutes'))), 'null') AS SIGNED),
|
||
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].maxMinutes'))), 'null') AS SIGNED),
|
||
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].level'))), 'null') AS SIGNED),
|
||
CASE JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].tempUnlockBeforeRequired')))
|
||
WHEN 'true' THEN 1 WHEN 'false' THEN 0 ELSE NULL END,
|
||
CASE JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].tempUnlockAfterRequired')))
|
||
WHEN 'true' THEN 1 WHEN 'false' THEN 0 ELSE NULL END,
|
||
v_gruppe_id
|
||
);
|
||
|
||
SET v_inner_count = IFNULL(
|
||
JSON_LENGTH(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].sperrt'))),
|
||
0);
|
||
SET j = 0;
|
||
WHILE j < v_inner_count DO
|
||
SET @wz = NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json,
|
||
CONCAT('$[', i, '].sperrt[', j, ']'))), 'null');
|
||
IF @wz IS NOT NULL AND @wz != '' THEN
|
||
INSERT IGNORE INTO sperre_sperre_fuer (sperre_id, werkzeug)
|
||
VALUES (v_sperre_id, @wz);
|
||
END IF;
|
||
SET j = j + 1;
|
||
END WHILE;
|
||
|
||
SET i = i + 1;
|
||
END WHILE;
|
||
|
||
-- ── Finisher ─────────────────────────────────────────────────────
|
||
-- GameSetFinisher hat kein geschlecht und keine benoetigt-Listen
|
||
-- tempUnlockBeforeRequired / tempUnlockAfterRequired haben kein Gegenstück in finisher
|
||
SET v_outer_count = IFNULL(JSON_LENGTH(v_finisher_json), 0);
|
||
SET i = 0;
|
||
WHILE i < v_outer_count DO
|
||
SET v_finisher_id = UUID();
|
||
|
||
INSERT INTO finisher
|
||
(finisher_id, kurz_text, text, geschlecht, gruppe_id)
|
||
VALUES (
|
||
v_finisher_id,
|
||
JSON_UNQUOTE(JSON_EXTRACT(v_finisher_json, CONCAT('$[', i, '].title'))),
|
||
JSON_UNQUOTE(JSON_EXTRACT(v_finisher_json, CONCAT('$[', i, '].description'))),
|
||
NULL,
|
||
v_gruppe_id
|
||
);
|
||
|
||
SET i = i + 1;
|
||
END WHILE;
|
||
|
||
END LOOP;
|
||
|
||
CLOSE cur;
|
||
|
||
END IF;
|
||
|
||
END;
|
||
|
||
CALL proc_migrate_chastity_game_set();
|
||
|
||
DROP PROCEDURE IF EXISTS proc_migrate_chastity_game_set;
|