-- save_filter, sync_token, set_custom_value all are kv-like
CREATE TABLE statestore_kv (
  kv_key BLOB PRIMARY KEY NOT NULL,
  kv_value BLOB NOT NULL
);
CREATE TABLE statestore_media (
  media_url TEXT PRIMARY KEY NOT NULL,
  media_data BYTEA NOT NULL,
  last_access TIMESTAMP WITH TIME ZONE NOT NULL -- Because this table is an LRU cache
);
CREATE INDEX statestore_media_last_access ON statestore_media (last_access);

-- room_infos and stripped_room_infos
CREATE TABLE statestore_rooms (
  room_id TEXT PRIMARY KEY NOT NULL,
  is_partial BOOLEAN NOT NULL,
  room_info JSON NOT NULL
);
CREATE TABLE statestore_accountdata (
  room_id TEXT NOT NULL,
  event_type TEXT NOT NULL,
  account_data JSON NOT NULL,
  PRIMARY KEY (room_id, event_type)
);
CREATE TABLE statestore_presence (
  user_id TEXT PRIMARY KEY NOT NULL,
  presence JSON NOT NULL
);
CREATE TABLE statestore_members (
  room_id TEXT NOT NULL,
  user_id TEXT NOT NULL,
  is_partial BOOLEAN NOT NULL,
  member_event JSON,
  user_profile JSON,
  displayname TEXT,
  joined BOOLEAN NOT NULL DEFAULT 0,
  PRIMARY KEY (room_id, user_id)
);
CREATE TABLE statestore_state (
  room_id TEXT NOT NULL,
  event_type TEXT NOT NULL,
  state_key TEXT NOT NULL,
  is_partial BOOLEAN NOT NULL,
  state_event JSON NOT NULL,
  PRIMARY KEY (room_id, event_type, state_key)
);
CREATE TABLE statestore_receipts (
  room_id TEXT NOT NULL,
  event_id TEXT NOT NULL,
  receipt_type TEXT NOT NULL,
  user_id TEXT NOT NULL,
  receipt JSON NOT NULL,
  PRIMARY KEY (room_id, receipt_type, user_id)
);
CREATE INDEX statestore_receipts_room_event ON statestore_receipts (room_id, receipt_type, event_id);
