create table users ( id integer primary key not null, username text unique not null, password_hash text not null ); create table sessions ( id bigint primary key not null, user_id bigint not null references users (id) on delete cascade, unique (id, user_id) ); create table devices ( id integer primary key not null, device_id text not null, user_id bigint not null references users (id) on delete cascade, caption text not null, type text not null, unique (user_id, device_id) ); create table subscriptions ( id integer primary key not null, device_id bigint not null references devices (id) on delete cascade, url text not null, time_changed bigint not null default 0, deleted boolean not null default false, unique (device_id, url) ); create table episode_actions ( id integer primary key not null, subscription_id bigint not null references subscriptions (id) on delete cascade, -- Can be null, as the device is not always provided device_id bigint references devices (id) on delete set null, episode text not null, timestamp bigint, action text not null, started integer, position integer, total integer, -- Position should be set if the action type is "Play" and null otherwise check ((action = "Play") = (position is not null)), -- Started and position can only be set if the action type is "Play" check (action = "Play" or (started is null and position is null)), -- Started and position should be provided together check ((started is null) = (total is null)) );