Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
62 lines
2.1 KiB
SQL
62 lines
2.1 KiB
SQL
-- 017: Wiki articles, revisions, link graph, and FTS
|
|
|
|
-- Wiki articles
|
|
CREATE TABLE IF NOT EXISTS articles (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
slug TEXT NOT NULL UNIQUE CHECK(length(slug) >= 2 AND length(slug) <= 100),
|
|
title TEXT NOT NULL,
|
|
body TEXT NOT NULL DEFAULT '',
|
|
created_by TEXT NOT NULL,
|
|
updated_by TEXT NOT NULL,
|
|
revision INTEGER NOT NULL DEFAULT 1,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX idx_articles_slug ON articles(slug);
|
|
CREATE INDEX idx_articles_updated_at ON articles(updated_at);
|
|
|
|
-- Revision history (full body per revision)
|
|
CREATE TABLE IF NOT EXISTS article_revisions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
article_id INTEGER NOT NULL REFERENCES articles(id) ON DELETE CASCADE,
|
|
revision INTEGER NOT NULL,
|
|
body TEXT NOT NULL,
|
|
changed_by TEXT NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX idx_article_revisions_article ON article_revisions(article_id, revision);
|
|
|
|
-- Link graph (rebuilt on every article create/update)
|
|
CREATE TABLE IF NOT EXISTS article_links (
|
|
from_slug TEXT NOT NULL,
|
|
to_slug TEXT NOT NULL,
|
|
display_text TEXT,
|
|
PRIMARY KEY (from_slug, to_slug)
|
|
);
|
|
|
|
CREATE INDEX idx_article_links_to ON article_links(to_slug);
|
|
|
|
-- FTS5 for article search
|
|
CREATE VIRTUAL TABLE IF NOT EXISTS articles_fts USING fts5(
|
|
title,
|
|
body,
|
|
content='articles',
|
|
content_rowid='id'
|
|
);
|
|
|
|
-- FTS sync triggers
|
|
CREATE TRIGGER articles_fts_ai AFTER INSERT ON articles BEGIN
|
|
INSERT INTO articles_fts(rowid, title, body) VALUES (new.id, new.title, new.body);
|
|
END;
|
|
CREATE TRIGGER articles_fts_ad AFTER DELETE ON articles BEGIN
|
|
INSERT INTO articles_fts(articles_fts, rowid, title, body) VALUES('delete', old.id, old.title, old.body);
|
|
END;
|
|
CREATE TRIGGER articles_fts_au AFTER UPDATE ON articles BEGIN
|
|
INSERT INTO articles_fts(articles_fts, rowid, title, body) VALUES('delete', old.id, old.title, old.body);
|
|
INSERT INTO articles_fts(rowid, title, body) VALUES (new.id, new.title, new.body);
|
|
END;
|
|
|
|
INSERT INTO schema_migrations (version) VALUES (17);
|