You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
4.7 KiB
115 lines
4.7 KiB
-- 已部署数据库的可重复执行升级脚本。
|
|
-- 执行前应先收敛同一 dock 的重复活动会话,否则活动会话唯一索引会拒绝创建。
|
|
|
|
DELIMITER $$
|
|
|
|
DROP PROCEDURE IF EXISTS upgrade_live_control $$
|
|
CREATE PROCEDURE upgrade_live_control()
|
|
BEGIN
|
|
DECLARE item_count INT DEFAULT 0;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'requested_by';
|
|
IF item_count = 0 THEN
|
|
ALTER TABLE live_session ADD COLUMN requested_by BIGINT NULL;
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'stop_deadline';
|
|
IF item_count = 0 THEN
|
|
ALTER TABLE live_session ADD COLUMN stop_deadline DATETIME NULL;
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'updated_at';
|
|
IF item_count = 0 THEN
|
|
ALTER TABLE live_session ADD COLUMN updated_at DATETIME NULL;
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'device_state_version';
|
|
IF item_count = 0 THEN
|
|
ALTER TABLE live_session ADD COLUMN device_state_version BIGINT DEFAULT 0;
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'device_event_id';
|
|
IF item_count = 0 THEN
|
|
ALTER TABLE live_session ADD COLUMN device_event_id VARCHAR(128);
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'device_updated_at';
|
|
IF item_count = 0 THEN
|
|
ALTER TABLE live_session ADD COLUMN device_updated_at BIGINT DEFAULT 0;
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'cloud_confirmed_at';
|
|
IF item_count = 0 THEN
|
|
ALTER TABLE live_session ADD COLUMN cloud_confirmed_at DATETIME NULL;
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.statistics
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND index_name = 'uk_live_session_device_event';
|
|
IF item_count = 0 THEN
|
|
CREATE UNIQUE INDEX uk_live_session_device_event ON live_session (device_event_id);
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.columns
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND column_name = 'active_dock_id';
|
|
IF item_count = 0 THEN
|
|
ALTER TABLE live_session ADD COLUMN active_dock_id VARCHAR(64) GENERATED ALWAYS AS (
|
|
CASE WHEN phase IN ('starting', 'streaming', 'reconnecting', 'stopping') THEN dock_id ELSE NULL END
|
|
) STORED;
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.statistics
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND index_name = 'idx_live_session_dock_phase';
|
|
IF item_count = 0 THEN
|
|
CREATE INDEX idx_live_session_dock_phase ON live_session (dock_id, phase, created_at);
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.statistics
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND index_name = 'idx_live_session_phase_deadline';
|
|
IF item_count = 0 THEN
|
|
CREATE INDEX idx_live_session_phase_deadline ON live_session (phase, stop_deadline);
|
|
END IF;
|
|
|
|
SELECT COUNT(*) INTO item_count
|
|
FROM information_schema.statistics
|
|
WHERE table_schema = DATABASE() AND table_name = 'live_session' AND index_name = 'uk_live_session_active_dock';
|
|
IF item_count = 0 THEN
|
|
CREATE UNIQUE INDEX uk_live_session_active_dock ON live_session (active_dock_id);
|
|
END IF;
|
|
|
|
CREATE TABLE IF NOT EXISTS live_viewer_lease (
|
|
id BIGINT PRIMARY KEY,
|
|
stream_session_id VARCHAR(128) NOT NULL,
|
|
viewer_id BIGINT NOT NULL,
|
|
expires_at DATETIME NOT NULL,
|
|
released_at DATETIME NULL,
|
|
created_at DATETIME NULL,
|
|
updated_at DATETIME NULL,
|
|
UNIQUE KEY uk_live_viewer (stream_session_id, viewer_id),
|
|
KEY idx_live_lease_expire (stream_session_id, expires_at),
|
|
KEY idx_live_lease_active (stream_session_id, released_at, expires_at),
|
|
CONSTRAINT fk_live_lease_session FOREIGN KEY (stream_session_id) REFERENCES live_session(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
END $$
|
|
|
|
CALL upgrade_live_control() $$
|
|
DROP PROCEDURE upgrade_live_control $$
|
|
|
|
DELIMITER ;
|
|
|