AtOM/share/schema.sql
Vincent Riquer 979280c330 Resolve "FEAT: support for releasecountry tag"
Resolve "Opus (and maybe vorbis?) tags aren't actually read!"
2025-02-10 00:52:00 +00:00

144 lines
3.5 KiB
SQL

BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS atom (
version INTEGER
);
CREATE TABLE IF NOT EXISTS source_files (
id INTEGER PRIMARY KEY,
filename TEXT UNIQUE NOT NULL,
size INTEGER NOT NULL,
hash TEXT,
mime_type INTEGER,
last_change FLOAT NOT NULL DEFAULT (strftime('%s','now')),
last_seen INTEGER NOT NULL DEFAULT (strftime('%s','now')),
FOREIGN KEY (mime_type) REFERENCES mime_types(id)
ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS destinations (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
enabled INTEGER DEFAULT 1
);
CREATE TABLE IF NOT EXISTS destination_files (
id INTEGER PRIMARY KEY,
filename TEXT,
old_filename TEXT,
rename_pattern TEXT,
fat32compat INTEGER,
ascii INTEGER,
last_change FLOAT NOT NULL DEFAULT 0,
source_file_id INTEGER,
destination_id INTEGER,
FOREIGN KEY (source_file_id) REFERENCES source_files(id)
ON DELETE SET NULL,
FOREIGN KEY (destination_id) REFERENCES destinations(id)
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS mime_types (
id INTEGER PRIMARY KEY,
mime_text TEXT UNIQUE NOT NULL
);
CREATE TABLE IF NOT EXISTS mime_actions (
id INTEGER PRIMARY KEY,
mime_type INTEGER,
destination_id INTEGER,
action INTEGER DEFAULT 1,
FOREIGN KEY (mime_type) REFERENCES mime_types(id),
FOREIGN KEY (destination_id) REFERENCES destinations(id)
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS tags (
source_file INTEGER PRIMARY KEY,
genre TEXT,
albumartist TEXT,
year TEXT,
album TEXT,
disc TEXT,
artist TEXT,
track TEXT,
title TEXT,
composer TEXT,
performer TEXT,
releasecountry TEXT,
depth INTEGER,
rate INTEGER,
channels INTEGER,
bitrate INTEGER,
last_change FLOAT,
tagreader TEXT,
FOREIGN KEY (source_file) REFERENCES source_files(id)
ON DELETE CASCADE
);
CREATE VIEW IF NOT EXISTS mime_type_actions AS
SELECT
mime_types.id,mime_types.mime_text,
mime_actions.destination_id,mime_actions.action
FROM mime_types INNER JOIN mime_actions
ON mime_actions.mime_type = mime_types.id;
CREATE TRIGGER IF NOT EXISTS update_mime_actions
INSTEAD OF UPDATE OF action ON mime_type_actions
BEGIN
UPDATE mime_actions
SET action=new.action
WHERE mime_type=old.id
AND destination_id=old.destination_id;
END;
CREATE TRIGGER IF NOT EXISTS create_dest_files_and_mime_actions
AFTER INSERT ON destinations
BEGIN
INSERT INTO mime_actions
(mime_type,destination_id)
SELECT id,new.id
FROM mime_types;
INSERT INTO destination_files
(source_file_id,destination_id)
SELECT id,new.id
FROM source_files;
END;
CREATE TRIGGER IF NOT EXISTS create_mime_actions AFTER INSERT ON mime_types
BEGIN
INSERT INTO mime_actions (mime_type,destination_id)
SELECT mime_types.id,destinations.id
FROM mime_types INNER JOIN destinations
WHERE mime_types.id=new.id;
END;
CREATE INDEX IF NOT EXISTS sourcefiles_by_name ON source_files (filename,id);
CREATE TRIGGER IF NOT EXISTS create_destinations AFTER INSERT ON source_files
BEGIN
INSERT INTO destination_files (source_file_id,destination_id)
SELECT source_files.id,destinations.id FROM source_files
INNER JOIN destinations
WHERE source_files.id=new.id;
END;
CREATE TRIGGER IF NOT EXISTS create_tags AFTER INSERT ON source_files
BEGIN
INSERT INTO tags (source_file,last_change) VALUES (new.id,0);
END;
CREATE TRIGGER IF NOT EXISTS force_destination_update_on_tag_update
AFTER UPDATE OF
genre,
albumartist,
year,
album,
disc,
artist,
track,
title,
composer,
performer,
rate,
channels,
bitrate,
bitdepth
ON tags
BEGIN
UPDATE destination_files SET last_change=0
WHERE source_file_id=old.source_file;
END;
COMMIT;