CREATE TABLE
Notes (
id UUID PRIMARY KEY,
title TEXT,
content JSON NOT NULL,
content_checksum TEXT NOT NULL,
content_plaintext TEXT NOT NULL,
classification CHAR(1) NOT NULL CHECK (classification IN ('C', 'S', 'T')), -- C = Confidential, S = Secret, T = Top Secret
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME DEFAULT NULL
);
CREATE TABLE
NoteHistory (
id INTEGER PRIMARY KEY AUTOINCREMENT,
note_id UUID NOT NULL,
content JSON NOT NULL,
content_checksum TEXT NOT NULL,
content_plaintext TEXT NOT NULL,
changed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (note_id) REFERENCES Notes (id)
);
CREATE VIRTUAL TABLE NoteSearch USING FTS5 (
id UNINDEXED,
title,
abstract,
content_plaintext,
created_at UNINDEXED
);
CREATE TRIGGER UpdateNoteSearch_Insert AFTER INSERT ON Notes WHEN NEW.deleted_at IS NULL BEGIN
INSERT INTO
NoteSearch (
id,
title,
abstract,
content_plaintext,
created_at
)
VALUES
(
NEW.id,
NEW.title,
SUBSTR (
NEW.content_plaintext,
1,
INSTR (
NEW.content_plaintext,
'\n',
INSTR (NEW.content_plaintext, '\n') + 1
) - 1
),
NEW.content_plaintext,
NEW.created_at
);
END;
CREATE TRIGGER UpdateNoteSearch_Update AFTER
UPDATE ON Notes WHEN NEW.deleted_at IS NULL BEGIN
INSERT INTO
NoteSearch (
id,
title,
abstract,
content_plaintext,
created_at
)
VALUES
(
NEW.id,
NEW.title,
SUBSTR (
NEW.content_plaintext,
1,
INSTR (
NEW.content_plaintext,
'\n',
INSTR (NEW.content_plaintext, '\n') + 1
) - 1
),
NEW.content_plaintext,
NEW.created_at
) ON CONFLICT (id) DO
UPDATE
SET
title = NEW.title,
abstract = SUBSTR (
NEW.content_plaintext,
1,
INSTR (
NEW.content_plaintext,
'\n',
INSTR (NEW.content_plaintext, '\n') + 1
) - 1
),
content_plaintext = NEW.content_plaintext,
created_at = NEW.created_at;
END;
CREATE TRIGGER RemoveNoteSearch AFTER
UPDATE ON Notes WHEN NEW.deleted_at IS NOT NULL BEGIN
DELETE FROM NoteSearch
WHERE
id = OLD.id;
END;