okc 0.1.0

A local-first tool for AI agents to browse, parse, search, and reason over Open Knowledge Format (OKF) repositories
Documentation
//! Metadata field CRUD operations for SqliteDocumentStore.

use crate::index::traits::Result;
use rusqlite::{params, Connection, Transaction};
use std::collections::BTreeMap;

pub fn insert_metadata_fields(
    conn: &Connection,
    doc_id: i64,
    fields: &BTreeMap<String, serde_json::Value>,
) -> Result<()> {
    conn.execute(
        "DELETE FROM metadata_fields WHERE document_id = ?1",
        params![doc_id],
    )?;
    for (key, value) in fields {
        let val_str = serde_json::to_string(value).unwrap_or_else(|_| "null".to_string());
        conn.execute(
            "INSERT INTO metadata_fields (document_id, key, value) VALUES (?1, ?2, ?3)",
            params![doc_id, key, val_str],
        )?;
    }
    Ok(())
}

pub fn insert_metadata_fields_tx(
    tx: &Transaction,
    doc_id: i64,
    fields: &BTreeMap<String, serde_json::Value>,
) -> Result<()> {
    tx.execute(
        "DELETE FROM metadata_fields WHERE document_id = ?1",
        params![doc_id],
    )?;
    for (key, value) in fields {
        let val_str = serde_json::to_string(value).unwrap_or_else(|_| "null".to_string());
        tx.execute(
            "INSERT INTO metadata_fields (document_id, key, value) VALUES (?1, ?2, ?3)",
            params![doc_id, key, val_str],
        )?;
    }
    Ok(())
}

pub fn get_metadata_fields(
    conn: &Connection,
    doc_id: i64,
) -> Result<BTreeMap<String, serde_json::Value>> {
    let mut stmt = conn.prepare("SELECT key, value FROM metadata_fields WHERE document_id = ?1")?;
    let mut fields = BTreeMap::new();
    for row in stmt.query_map(params![doc_id], |row| {
        Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?))
    })? {
        let (k, v) = row?;
        if let Ok(val) = serde_json::from_str(&v) {
            fields.insert(k, val);
        }
    }
    Ok(fields)
}

pub fn delete_metadata_fields(conn: &Connection, doc_id: i64) -> Result<()> {
    conn.execute(
        "DELETE FROM metadata_fields WHERE document_id = ?1",
        params![doc_id],
    )?;
    Ok(())
}