-- Extensions CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- Tables CREATE TABLE IF NOT EXISTS files ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, description TEXT, mimetype TEXT NOT NULL, size BIGINT NOT NULL, blake2 BYTEA NOT NULL UNIQUE, created TIMESTAMP DEFAULT NOW() NOT NULL, updated TIMESTAMP DEFAULT NOW() NOT NULL ); CREATE TABLE IF NOT EXISTS processing_jobs ( id BIGSERIAL PRIMARY KEY, file_id UUID REFERENCES files (id) ON DELETE CASCADE, created TIMESTAMP DEFAULT NOW(), started TIMESTAMP, completed TIMESTAMP, status TEXT, job_type TEXT, error TEXT, messages JSONB ); CREATE TABLE IF NOT EXISTS diec ( id BIGSERIAL PRIMARY KEY, file_id UUID REFERENCES files (id) ON DELETE CASCADE, data JSONB, created TIMESTAMP DEFAULT NOW() NOT NULL, updated TIMESTAMP DEFAULT NOW() NOT NULL ); CREATE TABLE IF NOT EXISTS msoffice_oleid ( id BIGSERIAL PRIMARY KEY, file_id UUID REFERENCES files (id) ON DELETE CASCADE, data JSONB, created TIMESTAMP DEFAULT NOW() NOT NULL, updated TIMESTAMP DEFAULT NOW() NOT NULL ); CREATE TABLE IF NOT EXISTS msoffice_olevba ( id BIGSERIAL PRIMARY KEY, file_id UUID REFERENCES files (id) ON DELETE CASCADE, data JSONB, created TIMESTAMP DEFAULT NOW() NOT NULL, updated TIMESTAMP DEFAULT NOW() NOT NULL ); CREATE TABLE IF NOT EXISTS msoffice_mraptor ( id BIGSERIAL PRIMARY KEY, file_id UUID REFERENCES files (id) ON DELETE CASCADE, data JSONB, created TIMESTAMP DEFAULT NOW() NOT NULL, updated TIMESTAMP DEFAULT NOW() NOT NULL ); -- Indices -- Since tables will be heavily accessed by file_id, there should be indices for them CREATE INDEX idx_diec_file_id ON diec (file_id); CREATE INDEX idx_processing_jobs_file_id ON processing_jobs (file_id); CREATE INDEX idx_msoffice_oleid_file_id ON msoffice_oleid (file_id); CREATE INDEX idx_msoffice_olevba_file_id ON msoffice_olevba (file_id); CREATE INDEX idx_msoffice_mraptor_file_id ON msoffice_mraptor (file_id);