低空智控平台 后端go
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

-- 已部署数据库的可重复执行升级脚本。
-- 执行前应先收敛同一 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 ;