From 283e2b4a51387d5de68e093f554209431134dd58 Mon Sep 17 00:00:00 2001 From: Stephen Waits <1+swaits@noreply.git.swaits.com> Date: Sun, 11 Oct 2026 01:37:17 +0000 Subject: [PATCH] First slice: ledger-store (journal+blobs+sqlite) and ledger-mcp (18 tools, receipt policy) --- crates/ledger-store/src/schema.rs | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 crates/ledger-store/src/schema.rs diff --git a/crates/ledger-store/src/schema.rs b/crates/ledger-store/src/schema.rs new file mode 100644 index 0000000..7eb5ca4 --- /dev/null +++ b/crates/ledger-store/src/schema.rs @@ -0,0 +1,64 @@ +//! SQLite schema and migrations. +//! +//! The projection schema. Amounts are TEXT (decimal strings) — never REAL. +//! Migrations are numbered SQL scripts applied in order; `SCHEMA_VERSION` +//! is the current version. + +/// Current schema version. +pub const SCHEMA_VERSION: u32 = 1; + +/// Migrations, in order. `MIGRATIONS[i]` migrates from version `i` to `i+1`. +pub const MIGRATIONS: &[&str] = &[r#" +CREATE TABLE IF NOT EXISTS meta( + key TEXT PRIMARY KEY, + value TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS accounts( + id INTEGER PRIMARY KEY, + code TEXT UNIQUE NOT NULL, + name TEXT NOT NULL, + type TEXT NOT NULL, + parent INTEGER NULL, + placeholder INTEGER NOT NULL, + currency TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS entries( + id INTEGER PRIMARY KEY, + date TEXT NOT NULL, + description TEXT NOT NULL, + status TEXT NOT NULL, + reversal_of INTEGER NULL +); +CREATE TABLE IF NOT EXISTS lines( + id INTEGER PRIMARY KEY AUTOINCREMENT, + entry_id INTEGER NOT NULL, + account_id INTEGER NOT NULL, + side TEXT NOT NULL, + amount TEXT NOT NULL, + currency TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS blobs( + sha256 TEXT PRIMARY KEY, + size_bytes INTEGER NOT NULL, + mime_type TEXT NOT NULL, + original_name TEXT NOT NULL, + created_at TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS attachments( + id INTEGER PRIMARY KEY, + blob_sha TEXT NOT NULL, + entry_id INTEGER NULL, + category TEXT NOT NULL, + description TEXT NULL, + created_at TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS events( + seq INTEGER PRIMARY KEY AUTOINCREMENT, + type TEXT NOT NULL, + payload TEXT NOT NULL, + created_at TEXT NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_lines_entry ON lines(entry_id); +CREATE INDEX IF NOT EXISTS idx_entries_date ON entries(date); +CREATE INDEX IF NOT EXISTS idx_attachments_entry ON attachments(entry_id); +"#];