-- Cheap fingerprint (file names, sizes and modification times) used to skip -- content hashing of soundtracks that have not changed since the last sync. ALTER TABLE soundtrack ADD COLUMN fingerprint TEXT NOT NULL DEFAULT ''; -- Play queues. Every client has its own queue, identified by the queue's UUID. -- Ended queues are kept as history. CREATE TABLE queue ( uuid UUID PRIMARY KEY DEFAULT gen_random_uuid(), current_song INT4 NOT NULL DEFAULT -1, -- The last random song, added to the queue by /music/addQue. last_fetched_song_uuid UUID NULL, started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), ended_at TIMESTAMPTZ NULL ); CREATE INDEX idx_queue_active ON queue(uuid) WHERE ended_at IS NULL; -- song_uuid has no foreign key: a sync can delete songs. The names are kept for the history. CREATE TABLE queue_song ( queue_uuid UUID NOT NULL REFERENCES queue(uuid) ON DELETE CASCADE, song_no INT4 NOT NULL, song_uuid UUID NOT NULL, soundtrack_name VARCHAR NOT NULL, song_name VARCHAR NOT NULL, added_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), PRIMARY KEY (queue_uuid, song_no) );