Initial commit: rustytokens — native codebase indexer + MCP server

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
endergebnisandCopilot committed 2026-09-04 02:43:00 +02:00
commit 354132e887
43 files changed
+3783

No files matched your search

+71
View File
@@ -0,0 +1,71 @@
//! SQLite schema + minimal migration (schema_version in metadata).
use anyhow::Result;
use rusqlite::Connection;
const SCHEMA_VERSION: i64 = 1;
const SCHEMA: &str = r#"
CREATE TABLE files (
id INTEGER PRIMARY KEY,
path TEXT NOT NULL UNIQUE,
content_hash TEXT NOT NULL,
language TEXT NOT NULL,
mtime INTEGER NOT NULL
);
CREATE TABLE symbols (
id INTEGER PRIMARY KEY,
file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE,
name TEXT NOT NULL,
qualified_name TEXT NOT NULL,
kind TEXT NOT NULL,
signature TEXT,
line_start INTEGER NOT NULL,
line_end INTEGER NOT NULL
);
CREATE INDEX idx_symbols_file ON symbols(file_id);
CREATE INDEX idx_symbols_name ON symbols(name);
CREATE TABLE imports (
id INTEGER PRIMARY KEY,
from_file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE,
to_file_id INTEGER NOT NULL REFERENCES files(id) ON DELETE CASCADE,
import_type TEXT NOT NULL
);
CREATE INDEX idx_imports_from ON imports(from_file_id);
CREATE INDEX idx_imports_to ON imports(to_file_id);
CREATE VIRTUAL TABLE symbols_fts USING fts5(
name, qualified_name, kind, signature,
content='symbols', content_rowid='id'
);
CREATE TRIGGER symbols_ai AFTER INSERT ON symbols BEGIN
INSERT INTO symbols_fts(rowid, name, qualified_name, kind, signature)
VALUES (new.id, new.name, new.qualified_name, new.kind, new.signature);
END;
CREATE TRIGGER symbols_ad AFTER DELETE ON symbols BEGIN
INSERT INTO symbols_fts(symbols_fts, rowid, name, qualified_name, kind, signature)
VALUES ('delete', old.id, old.name, old.qualified_name, old.kind, old.signature);
END;
CREATE VIRTUAL TABLE content_fts USING fts5(path UNINDEXED, content);
"#;
/// Create schema if missing, or migrate to the current version.
pub fn init(conn: &mut Connection) -> Result<()> {
conn.execute_batch(
"CREATE TABLE IF NOT EXISTS metadata (key TEXT PRIMARY KEY, value TEXT NOT NULL);",
)?;
let version: i64 = conn
.query_row(
"SELECT COALESCE(CAST(value AS INTEGER), 0) FROM metadata WHERE key='schema_version'",
[],
|r| r.get(0),
)
.unwrap_or(0);
if version < SCHEMA_VERSION {
conn.execute_batch(SCHEMA)?;
conn.execute(
"INSERT OR REPLACE INTO metadata (key, value) VALUES ('schema_version', ?1)",
[SCHEMA_VERSION.to_string()],
)?;
}
Ok(())
}