Files
webmail/lib/store/mail/schema.ts
T

96 lines
3.3 KiB
TypeScript

import type { Migration } from '../storage';
export const MAIL_MIGRATIONS: readonly Migration[] = [
{
id: 100,
name: 'mail',
sql: `
CREATE TABLE email (
rowid INTEGER PRIMARY KEY,
jmap TEXT NOT NULL,
id TEXT NOT NULL,
thread_id TEXT,
received_at INTEGER NOT NULL,
sent_at INTEGER,
size INTEGER NOT NULL DEFAULT 0,
has_attachment INTEGER NOT NULL DEFAULT 0,
subject_sort TEXT,
from_sort TEXT,
to_sort TEXT,
json TEXT NOT NULL,
-- 0 no body yet, 1 kept, 2 the server had none to give
body_state INTEGER NOT NULL DEFAULT 0,
gen INTEGER NOT NULL DEFAULT 0,
UNIQUE (jmap, id)
);
CREATE INDEX email_received ON email (jmap, received_at DESC, rowid DESC);
CREATE INDEX email_thread ON email (jmap, thread_id);
CREATE INDEX email_backfill ON email (jmap, body_state, received_at DESC);
CREATE TABLE email_mailbox (
email_rowid INTEGER NOT NULL REFERENCES email (rowid) ON DELETE CASCADE,
jmap TEXT NOT NULL,
mailbox_id TEXT NOT NULL,
received_at INTEGER NOT NULL,
PRIMARY KEY (email_rowid, mailbox_id)
) WITHOUT ROWID;
CREATE INDEX email_mailbox_list ON email_mailbox (jmap, mailbox_id, received_at DESC, email_rowid DESC);
CREATE TABLE email_keyword (
email_rowid INTEGER NOT NULL REFERENCES email (rowid) ON DELETE CASCADE,
keyword TEXT NOT NULL,
PRIMARY KEY (email_rowid, keyword)
) WITHOUT ROWID;
CREATE INDEX email_keyword_lookup ON email_keyword (keyword, email_rowid);
CREATE TABLE email_body (
email_rowid INTEGER PRIMARY KEY REFERENCES email (rowid) ON DELETE CASCADE,
json TEXT NOT NULL
);
CREATE TABLE thread (
jmap TEXT NOT NULL,
id TEXT NOT NULL,
email_ids TEXT NOT NULL,
PRIMARY KEY (jmap, id)
) WITHOUT ROWID;
CREATE VIRTUAL TABLE email_fts_word USING fts5(
subject, from_addr, to_addr, body,
content = '', contentless_delete = 1,
tokenize = 'unicode61 remove_diacritics 2'
);
CREATE VIRTUAL TABLE email_fts_tri USING fts5(
subject, from_addr, to_addr, body,
content = '', contentless_delete = 1,
tokenize = 'trigram remove_diacritics 1'
);
`,
},
{
id: 101,
name: 'mail attachments',
sql: `
-- The attachments and inline images of kept messages.
CREATE TABLE email_part (
jmap TEXT NOT NULL,
blob_id TEXT NOT NULL,
email_rowid INTEGER NOT NULL,
received_at INTEGER NOT NULL,
size INTEGER NOT NULL DEFAULT 0,
type TEXT,
name TEXT,
-- 1 when the server wouldn't give it: not asked for again
refused INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (jmap, blob_id, email_rowid)
) WITHOUT ROWID;
CREATE INDEX email_part_message ON email_part (email_rowid);
CREATE INDEX email_part_newest ON email_part (jmap, received_at DESC);
CREATE TABLE blob (
jmap TEXT NOT NULL,
blob_id TEXT NOT NULL,
type TEXT,
size INTEGER NOT NULL,
at INTEGER NOT NULL,
data BLOB NOT NULL,
PRIMARY KEY (jmap, blob_id)
) WITHOUT ROWID;
`,
},
];