Weiter am Ingame Chastity Game gearbeitet
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled
This commit is contained in:
215
bin/main/db/migration/V3__migrate_chastity_game_set.sql
Normal file
215
bin/main/db/migration/V3__migrate_chastity_game_set.sql
Normal file
@@ -0,0 +1,215 @@
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user