AtOM/share/schema.sql
2025-03-16 01:51:12 +01:00

147 lines
3.6 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,
replaygain_alb FLOAT,
replaygain_trk FLOAT,
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,
releasecountry,
rate,
channels,
bitrate,
bitdepth
ON tags
BEGIN
UPDATE destination_files SET last_change=0
WHERE source_file_id=old.source_file;
END;
COMMIT;