Files
Starlight_Lancher/packages/app-lib/migrations/20260611120000_instances-content-foundation.sql

377 lines
9.0 KiB
SQL

CREATE TABLE instances (
id TEXT NOT NULL,
path TEXT NOT NULL,
applied_content_set_id TEXT NULL,
install_stage TEXT NOT NULL,
launcher_feature_version TEXT NOT NULL,
update_channel TEXT NOT NULL DEFAULT 'release',
name TEXT NOT NULL,
icon_path TEXT NULL,
created INTEGER NOT NULL,
modified INTEGER NOT NULL,
last_played INTEGER NULL,
submitted_time_played INTEGER NOT NULL DEFAULT 0,
recent_time_played INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE (path)
);
CREATE INDEX instances_path ON instances(path);
CREATE INDEX instances_applied_content_set_id
ON instances(applied_content_set_id);
CREATE TABLE instance_links (
instance_id TEXT NOT NULL,
link_kind TEXT NOT NULL,
modrinth_project_id TEXT NULL,
modrinth_version_id TEXT NULL,
server_project_id TEXT NULL,
content_project_id TEXT NULL,
content_version_id TEXT NULL,
hosting_server_id TEXT NULL,
hosting_instance_ids JSONB NULL,
hosting_active_instance_id TEXT NULL,
shared_instance_id TEXT NULL,
PRIMARY KEY (instance_id),
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE
);
CREATE INDEX instance_links_link_kind ON instance_links(link_kind);
CREATE INDEX instance_links_modrinth_project_id
ON instance_links(modrinth_project_id);
CREATE INDEX instance_links_server_project_id
ON instance_links(server_project_id);
CREATE INDEX instance_links_hosting_server_id
ON instance_links(hosting_server_id);
CREATE INDEX instance_links_hosting_active_instance_id
ON instance_links(hosting_active_instance_id);
CREATE INDEX instance_links_shared_instance_id
ON instance_links(shared_instance_id);
CREATE TABLE instance_groups (
instance_id TEXT NOT NULL,
group_name TEXT NOT NULL,
PRIMARY KEY (instance_id, group_name),
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE
);
CREATE INDEX instance_groups_group_name ON instance_groups(group_name);
CREATE TABLE instance_launch_overrides (
instance_id TEXT NOT NULL,
overrides JSONB NOT NULL,
PRIMARY KEY (instance_id),
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE
);
CREATE TABLE instance_content_sets (
id TEXT NOT NULL,
instance_id TEXT NOT NULL,
name TEXT NOT NULL,
source_kind TEXT NOT NULL,
status TEXT NOT NULL,
game_version TEXT NOT NULL,
protocol_version INTEGER NULL,
loader TEXT NOT NULL,
loader_version TEXT NULL,
created INTEGER NOT NULL,
modified INTEGER NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE
);
CREATE INDEX instance_content_sets_instance_id
ON instance_content_sets(instance_id);
CREATE TABLE instance_content_set_remote_refs (
content_set_id TEXT NOT NULL,
ref_type TEXT NOT NULL,
ref_id TEXT NOT NULL,
PRIMARY KEY (content_set_id, ref_type),
FOREIGN KEY (content_set_id)
REFERENCES instance_content_sets(id)
ON DELETE CASCADE
);
CREATE INDEX instance_content_set_remote_refs_ref
ON instance_content_set_remote_refs(ref_type, ref_id);
CREATE TABLE instance_content_set_sync_state (
content_set_id TEXT NOT NULL,
provider TEXT NOT NULL,
applied_update_id TEXT NULL,
latest_available_update_id TEXT NULL,
checked_at INTEGER NULL,
status TEXT NOT NULL,
PRIMARY KEY (content_set_id),
FOREIGN KEY (content_set_id)
REFERENCES instance_content_sets(id)
ON DELETE CASCADE
);
CREATE INDEX instance_content_set_sync_state_provider
ON instance_content_set_sync_state(provider);
CREATE INDEX instance_content_set_sync_state_latest_available_update_id
ON instance_content_set_sync_state(latest_available_update_id);
CREATE TABLE instance_files (
id TEXT NOT NULL,
instance_id TEXT NOT NULL,
relative_path TEXT NOT NULL,
file_name TEXT NOT NULL,
enabled INTEGER NOT NULL,
sha1 TEXT NOT NULL,
size INTEGER NOT NULL,
missing INTEGER NOT NULL DEFAULT 0,
added_at INTEGER NOT NULL,
modified_at INTEGER NOT NULL,
PRIMARY KEY (id),
UNIQUE (instance_id, relative_path),
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE
);
CREATE INDEX instance_files_instance_id ON instance_files(instance_id);
CREATE INDEX instance_files_sha1 ON instance_files(sha1);
CREATE INDEX instance_files_missing ON instance_files(missing);
CREATE TABLE instance_content_entries (
id TEXT NOT NULL,
instance_id TEXT NOT NULL,
content_set_id TEXT NOT NULL,
file_id TEXT NULL,
project_type TEXT NOT NULL,
project_id TEXT NULL,
version_id TEXT NULL,
source_kind TEXT NOT NULL,
server_requirement TEXT NOT NULL,
client_requirement TEXT NOT NULL,
enabled INTEGER NOT NULL DEFAULT 1,
added_at INTEGER NOT NULL,
modified_at INTEGER NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (instance_id) REFERENCES instances(id) ON DELETE CASCADE,
FOREIGN KEY (content_set_id)
REFERENCES instance_content_sets(id)
ON DELETE CASCADE,
FOREIGN KEY (file_id) REFERENCES instance_files(id) ON DELETE SET NULL
);
CREATE INDEX instance_content_entries_instance_id
ON instance_content_entries(instance_id);
CREATE INDEX instance_content_entries_content_set_id
ON instance_content_entries(content_set_id);
CREATE INDEX instance_content_entries_file_id
ON instance_content_entries(file_id);
CREATE INDEX instance_content_entries_project_id
ON instance_content_entries(project_id);
CREATE INDEX instance_content_entries_version_id
ON instance_content_entries(version_id);
CREATE INDEX instance_content_entries_source_kind
ON instance_content_entries(source_kind);
CREATE TABLE instance_content_update_checks (
content_entry_id TEXT NOT NULL,
update_channel TEXT NOT NULL,
update_version_id TEXT NULL,
checked_at INTEGER NOT NULL,
PRIMARY KEY (content_entry_id),
FOREIGN KEY (content_entry_id)
REFERENCES instance_content_entries(id)
ON DELETE CASCADE
);
CREATE INDEX instance_content_update_checks_update_version_id
ON instance_content_update_checks(update_version_id);
INSERT INTO instances (
id,
path,
applied_content_set_id,
install_stage,
launcher_feature_version,
update_channel,
name,
icon_path,
created,
modified,
last_played,
submitted_time_played,
recent_time_played
)
SELECT
'legacy:' || path,
path,
'legacy:' || path || ':default',
install_stage,
launcher_feature_version,
preferred_update_channel,
name,
icon_path,
created,
modified,
last_played,
submitted_time_played,
recent_time_played
FROM profiles;
INSERT INTO instance_content_sets (
id,
instance_id,
name,
source_kind,
status,
game_version,
protocol_version,
loader,
loader_version,
created,
modified
)
SELECT
'legacy:' || path || ':default',
'legacy:' || path,
'Default',
CASE
WHEN linked_project_id IS NOT NULL
AND linked_version_id IS NOT NULL
AND linked_version_id != ''
THEN 'modrinth_modpack'
WHEN linked_project_id IS NOT NULL
AND (linked_version_id IS NULL OR linked_version_id = '')
THEN 'server_project'
ELSE 'local'
END,
'available',
game_version,
protocol_version,
mod_loader,
mod_loader_version,
created,
modified
FROM profiles;
INSERT INTO instance_links (
instance_id,
link_kind,
modrinth_project_id,
modrinth_version_id,
server_project_id,
content_project_id,
content_version_id,
hosting_server_id,
hosting_instance_ids,
hosting_active_instance_id,
shared_instance_id
)
SELECT
'legacy:' || path,
CASE
WHEN linked_project_id IS NULL
THEN 'unmanaged'
WHEN linked_version_id IS NULL OR linked_version_id = ''
THEN 'server_project'
ELSE 'modrinth_modpack'
END,
CASE
WHEN linked_version_id IS NOT NULL AND linked_version_id != ''
THEN linked_project_id
ELSE NULL
END,
CASE
WHEN linked_version_id IS NOT NULL AND linked_version_id != ''
THEN linked_version_id
ELSE NULL
END,
CASE
WHEN linked_project_id IS NOT NULL
AND (linked_version_id IS NULL OR linked_version_id = '')
THEN linked_project_id
ELSE NULL
END,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
FROM profiles;
INSERT OR IGNORE INTO instance_groups (instance_id, group_name)
SELECT
'legacy:' || profiles.path,
json_each.value
FROM profiles, json_each(profiles.groups);
INSERT INTO instance_launch_overrides (
instance_id,
overrides
)
SELECT
'legacy:' || path,
jsonb(json_object(
'java_path', override_java_path,
'extra_launch_args', json(CASE
WHEN json_type(override_extra_launch_args) = 'null' THEN 'null'
ELSE json(override_extra_launch_args)
END),
'custom_env_vars', json(CASE
WHEN json_type(override_custom_env_vars) = 'null' THEN 'null'
ELSE json(override_custom_env_vars)
END),
'memory', json(CASE
WHEN override_mc_memory_max IS NULL THEN 'null'
ELSE json_object('maximum', override_mc_memory_max)
END),
'force_fullscreen', json(CASE
WHEN override_mc_force_fullscreen IS NULL THEN 'null'
WHEN override_mc_force_fullscreen = 0 THEN 'false'
ELSE 'true'
END),
'game_resolution', json(CASE
WHEN override_mc_game_resolution_x IS NULL
OR override_mc_game_resolution_y IS NULL
THEN 'null'
ELSE json_array(
override_mc_game_resolution_x,
override_mc_game_resolution_y
)
END),
'hooks', json_object(
'pre_launch', COALESCE(override_hook_pre_launch, ''),
'wrapper', COALESCE(override_hook_wrapper, ''),
'post_exit', COALESCE(override_hook_post_exit, '')
)
))
FROM profiles;