mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
chore(library): squash pre-RC migrations into single 001_initial baseline (#919)
* chore(library): squash pre-RC migrations into single 001_initial baseline Library SQLite never shipped in a release, so fold migrations 002–008 into 001_initial.sql and drop the dev-only mood-facts purge (009). Sets LIBRARY_DB_SCHEMA_VERSION to 1 for the RC baseline; analysis migrations unchanged. * docs: note library migration squash in CHANGELOG and credits (PR #919) * fix(library): keep migration SQL files on disk after RC baseline squash Restore 002–009 as historical dev migration scripts. Runner still ships only 001 for fresh installs; existing DBs with applied versions are unchanged. Drop credits/CHANGELOG note for this small internal change.
This commit is contained in:
@@ -45,6 +45,7 @@ CREATE TABLE sync_state (
|
|||||||
initial_sync_cursor_json TEXT NOT NULL DEFAULT '{}',
|
initial_sync_cursor_json TEXT NOT NULL DEFAULT '{}',
|
||||||
sync_phase TEXT NOT NULL DEFAULT 'idle',
|
sync_phase TEXT NOT NULL DEFAULT 'idle',
|
||||||
last_error TEXT,
|
last_error TEXT,
|
||||||
|
n1_bulk_unreliable INTEGER NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (server_id, library_scope)
|
PRIMARY KEY (server_id, library_scope)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -108,6 +109,7 @@ CREATE TABLE track (
|
|||||||
content_hash TEXT,
|
content_hash TEXT,
|
||||||
server_updated_at INTEGER,
|
server_updated_at INTEGER,
|
||||||
server_created_at INTEGER,
|
server_created_at INTEGER,
|
||||||
|
resync_gen INTEGER NOT NULL DEFAULT 0,
|
||||||
deleted INTEGER NOT NULL DEFAULT 0,
|
deleted INTEGER NOT NULL DEFAULT 0,
|
||||||
synced_at INTEGER NOT NULL,
|
synced_at INTEGER NOT NULL,
|
||||||
raw_json TEXT NOT NULL,
|
raw_json TEXT NOT NULL,
|
||||||
@@ -233,6 +235,19 @@ CREATE TABLE canonical_enrichment_link (
|
|||||||
FOREIGN KEY (canonical_id) REFERENCES canonical_track(id)
|
FOREIGN KEY (canonical_id) REFERENCES canonical_track(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE play_session (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
server_id TEXT NOT NULL,
|
||||||
|
track_id TEXT NOT NULL,
|
||||||
|
started_at_ms INTEGER NOT NULL,
|
||||||
|
listened_sec REAL NOT NULL,
|
||||||
|
position_max_sec REAL NOT NULL,
|
||||||
|
completion TEXT NOT NULL,
|
||||||
|
end_reason TEXT NOT NULL,
|
||||||
|
FOREIGN KEY (server_id, track_id) REFERENCES track(server_id, id),
|
||||||
|
CHECK (completion IN ('partial', 'full'))
|
||||||
|
);
|
||||||
|
|
||||||
CREATE INDEX idx_track_album ON track(server_id, album_id) WHERE deleted = 0;
|
CREATE INDEX idx_track_album ON track(server_id, album_id) WHERE deleted = 0;
|
||||||
CREATE INDEX idx_track_artist ON track(server_id, artist_id) WHERE deleted = 0;
|
CREATE INDEX idx_track_artist ON track(server_id, artist_id) WHERE deleted = 0;
|
||||||
CREATE INDEX idx_track_updated ON track(server_id, server_updated_at DESC) WHERE deleted = 0;
|
CREATE INDEX idx_track_updated ON track(server_id, server_updated_at DESC) WHERE deleted = 0;
|
||||||
@@ -245,3 +260,36 @@ CREATE INDEX idx_track_artifact_lookup ON track_artifact(server_id, track_id, ar
|
|||||||
CREATE INDEX idx_track_offline_hash ON track_offline(server_id, content_hash);
|
CREATE INDEX idx_track_offline_hash ON track_offline(server_id, content_hash);
|
||||||
CREATE INDEX idx_track_id_history_new ON track_id_history(server_id, new_id);
|
CREATE INDEX idx_track_id_history_new ON track_id_history(server_id, new_id);
|
||||||
CREATE INDEX idx_canonical_identity_lookup ON canonical_identity(kind, value);
|
CREATE INDEX idx_canonical_identity_lookup ON canonical_identity(kind, value);
|
||||||
|
|
||||||
|
CREATE INDEX idx_track_remap_path
|
||||||
|
ON track(server_id, server_path)
|
||||||
|
WHERE deleted = 0 AND server_path IS NOT NULL AND server_path != '';
|
||||||
|
|
||||||
|
CREATE INDEX idx_track_remap_hash
|
||||||
|
ON track(server_id, content_hash)
|
||||||
|
WHERE deleted = 0 AND content_hash IS NOT NULL AND content_hash != '';
|
||||||
|
|
||||||
|
CREATE INDEX idx_track_title
|
||||||
|
ON track(server_id, title COLLATE NOCASE)
|
||||||
|
WHERE deleted = 0;
|
||||||
|
|
||||||
|
CREATE INDEX idx_track_genre
|
||||||
|
ON track(server_id, genre COLLATE NOCASE)
|
||||||
|
WHERE deleted = 0 AND genre IS NOT NULL;
|
||||||
|
|
||||||
|
CREATE INDEX idx_track_year
|
||||||
|
ON track(server_id, year)
|
||||||
|
WHERE deleted = 0 AND year IS NOT NULL;
|
||||||
|
|
||||||
|
CREATE INDEX idx_play_session_server_time
|
||||||
|
ON play_session(server_id, started_at_ms DESC);
|
||||||
|
|
||||||
|
CREATE INDEX idx_play_session_track
|
||||||
|
ON play_session(server_id, track_id, started_at_ms DESC);
|
||||||
|
|
||||||
|
CREATE INDEX idx_play_session_started
|
||||||
|
ON play_session(started_at_ms DESC);
|
||||||
|
|
||||||
|
CREATE INDEX idx_track_fact_mood_tag
|
||||||
|
ON track_fact(server_id, fact_kind, value_text, track_id)
|
||||||
|
WHERE fact_kind = 'mood_tag';
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use tauri::Manager;
|
|||||||
|
|
||||||
/// Current head of the embedded migrations. Bump each time a new
|
/// Current head of the embedded migrations. Bump each time a new
|
||||||
/// `migrations/NNN_*.sql` is added.
|
/// `migrations/NNN_*.sql` is added.
|
||||||
pub const LIBRARY_DB_SCHEMA_VERSION: i64 = 9;
|
pub const LIBRARY_DB_SCHEMA_VERSION: i64 = 1;
|
||||||
|
|
||||||
/// Lowest applied schema version the current code can advance from purely
|
/// Lowest applied schema version the current code can advance from purely
|
||||||
/// additively. If a DB carries a version below this, the breaking-bump hook
|
/// additively. If a DB carries a version below this, the breaking-bump hook
|
||||||
@@ -22,33 +22,10 @@ pub const LIBRARY_DB_SCHEMA_VERSION: i64 = 9;
|
|||||||
pub const LIBRARY_DB_MIN_COMPATIBLE_VERSION: i64 = 1;
|
pub const LIBRARY_DB_MIN_COMPATIBLE_VERSION: i64 = 1;
|
||||||
|
|
||||||
pub(crate) const INITIAL_SQL: &str = include_str!("../migrations/001_initial.sql");
|
pub(crate) const INITIAL_SQL: &str = include_str!("../migrations/001_initial.sql");
|
||||||
const MIGRATION_002_N1_BULK_UNRELIABLE: &str =
|
|
||||||
include_str!("../migrations/002_n1_bulk_unreliable.sql");
|
|
||||||
const MIGRATION_003_TRACK_REMAP_INDEXES: &str =
|
|
||||||
include_str!("../migrations/003_track_remap_indexes.sql");
|
|
||||||
const MIGRATION_004_TRACK_TITLE_INDEX: &str =
|
|
||||||
include_str!("../migrations/004_track_title_index.sql");
|
|
||||||
const MIGRATION_005_TRACK_GENRE_YEAR_INDEXES: &str =
|
|
||||||
include_str!("../migrations/005_track_genre_year_indexes.sql");
|
|
||||||
const MIGRATION_006_PLAY_SESSION: &str = include_str!("../migrations/006_play_session.sql");
|
|
||||||
const MIGRATION_007_RESYNC_GEN: &str = include_str!("../migrations/007_resync_gen.sql");
|
|
||||||
const MIGRATION_008_MOOD_TAG_INDEX: &str = include_str!("../migrations/008_mood_tag_index.sql");
|
|
||||||
const MIGRATION_009_PURGE_MOOD_FACTS: &str =
|
|
||||||
include_str!("../migrations/009_purge_mood_facts.sql");
|
|
||||||
|
|
||||||
/// Embedded migrations. Ordered ascending by `version`; the runner sorts
|
/// Embedded migrations. Ordered ascending by `version`; the runner sorts
|
||||||
/// defensively before applying so the source order can stay readable.
|
/// defensively before applying so the source order can stay readable.
|
||||||
const MIGRATIONS: &[(i64, &str)] = &[
|
const MIGRATIONS: &[(i64, &str)] = &[(1, INITIAL_SQL)];
|
||||||
(1, INITIAL_SQL),
|
|
||||||
(2, MIGRATION_002_N1_BULK_UNRELIABLE),
|
|
||||||
(3, MIGRATION_003_TRACK_REMAP_INDEXES),
|
|
||||||
(4, MIGRATION_004_TRACK_TITLE_INDEX),
|
|
||||||
(5, MIGRATION_005_TRACK_GENRE_YEAR_INDEXES),
|
|
||||||
(6, MIGRATION_006_PLAY_SESSION),
|
|
||||||
(7, MIGRATION_007_RESYNC_GEN),
|
|
||||||
(8, MIGRATION_008_MOOD_TAG_INDEX),
|
|
||||||
(9, MIGRATION_009_PURGE_MOOD_FACTS),
|
|
||||||
];
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub(crate) enum MigrationOutcome {
|
pub(crate) enum MigrationOutcome {
|
||||||
@@ -553,6 +530,7 @@ mod tests {
|
|||||||
"track_fact",
|
"track_fact",
|
||||||
"track_id_history",
|
"track_id_history",
|
||||||
"track_offline",
|
"track_offline",
|
||||||
|
"play_session",
|
||||||
] {
|
] {
|
||||||
assert!(
|
assert!(
|
||||||
tables.iter().any(|t| t == expected),
|
tables.iter().any(|t| t == expected),
|
||||||
|
|||||||
Reference in New Issue
Block a user