From 7c4692a4d167397b34a0fa65d1292ebb18ec499f Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Mon, 9 Feb 2026 13:07:10 +0300 Subject: [PATCH] migrations: add V19 migration for markdown bidirectional links Signed-off-by: NotAShelf Change-Id: I19a54224b20624ecaed8e010c1ecb67e6a6a6964 --- migrations/postgres/V19__markdown_links.sql | 35 +++++++++++++++++++++ migrations/sqlite/V19__markdown_links.sql | 35 +++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 migrations/postgres/V19__markdown_links.sql create mode 100644 migrations/sqlite/V19__markdown_links.sql diff --git a/migrations/postgres/V19__markdown_links.sql b/migrations/postgres/V19__markdown_links.sql new file mode 100644 index 0000000..b0d5475 --- /dev/null +++ b/migrations/postgres/V19__markdown_links.sql @@ -0,0 +1,35 @@ +-- V19: Markdown Links (Obsidian-style bidirectional links) +-- Adds support for wikilinks, markdown links, embeds, and backlink tracking + +-- Table for storing extracted markdown links +CREATE TABLE IF NOT EXISTS markdown_links ( + id TEXT PRIMARY KEY NOT NULL, + source_media_id TEXT NOT NULL, + target_path TEXT NOT NULL, -- raw link target (wikilink or path) + target_media_id TEXT, -- resolved media_id (nullable if unresolved) + link_type TEXT NOT NULL, -- 'wikilink', 'markdown_link', 'embed' + link_text TEXT, -- display text for the link + line_number INTEGER, -- line number in source file + context TEXT, -- surrounding text for preview + created_at TIMESTAMPTZ NOT NULL, + FOREIGN KEY (source_media_id) REFERENCES media_items(id) ON DELETE CASCADE, + FOREIGN KEY (target_media_id) REFERENCES media_items(id) ON DELETE SET NULL +); + +-- Index for efficient outgoing link queries (what does this note link to?) +CREATE INDEX idx_links_source ON markdown_links(source_media_id); + +-- Index for efficient backlink queries (what links to this note?) +CREATE INDEX idx_links_target ON markdown_links(target_media_id); + +-- Index for path-based resolution (finding unresolved links) +CREATE INDEX idx_links_target_path ON markdown_links(target_path); + +-- Index for link type filtering +CREATE INDEX idx_links_type ON markdown_links(link_type); + +-- Track when links were last extracted from a media item +ALTER TABLE media_items ADD COLUMN links_extracted_at TIMESTAMPTZ; + +-- Index for finding media items that need link extraction +CREATE INDEX idx_media_links_extracted ON media_items(links_extracted_at); diff --git a/migrations/sqlite/V19__markdown_links.sql b/migrations/sqlite/V19__markdown_links.sql new file mode 100644 index 0000000..7cbdda3 --- /dev/null +++ b/migrations/sqlite/V19__markdown_links.sql @@ -0,0 +1,35 @@ +-- V19: Markdown Links (Obsidian-style bidirectional links) +-- Adds support for wikilinks, markdown links, embeds, and backlink tracking + +-- Table for storing extracted markdown links +CREATE TABLE IF NOT EXISTS markdown_links ( + id TEXT PRIMARY KEY NOT NULL, + source_media_id TEXT NOT NULL, + target_path TEXT NOT NULL, -- raw link target (wikilink or path) + target_media_id TEXT, -- resolved media_id (nullable if unresolved) + link_type TEXT NOT NULL, -- 'wikilink', 'markdown_link', 'embed' + link_text TEXT, -- display text for the link + line_number INTEGER, -- line number in source file + context TEXT, -- surrounding text for preview + created_at TEXT NOT NULL, + FOREIGN KEY (source_media_id) REFERENCES media_items(id) ON DELETE CASCADE, + FOREIGN KEY (target_media_id) REFERENCES media_items(id) ON DELETE SET NULL +); + +-- Index for efficient outgoing link queries (what does this note link to?) +CREATE INDEX idx_links_source ON markdown_links(source_media_id); + +-- Index for efficient backlink queries (what links to this note?) +CREATE INDEX idx_links_target ON markdown_links(target_media_id); + +-- Index for path-based resolution (finding unresolved links) +CREATE INDEX idx_links_target_path ON markdown_links(target_path); + +-- Index for link type filtering +CREATE INDEX idx_links_type ON markdown_links(link_type); + +-- Track when links were last extracted from a media item +ALTER TABLE media_items ADD COLUMN links_extracted_at TEXT; + +-- Index for finding media items that need link extraction +CREATE INDEX idx_media_links_extracted ON media_items(links_extracted_at);