sinter-store 0.53.0

Embedded persistent graph store (redb), queryable without loading the world
Documentation
use redb::{ReadableDatabase, ReadableTableMetadata};

#[test]
#[ignore = "scratch: per-table size report for a real db (SINTER_DB env)"]
fn table_sizes() {
    let path = std::env::var("SINTER_DB").expect("set SINTER_DB");
    let db = redb::Database::open(&path).unwrap();
    let txn = db.begin_read().unwrap();
    let mut rows = Vec::new();
    for name in [
        "nodes",
        "out_edges",
        "in_edges",
        "unresolved",
        "file_facts",
        "file_hash",
        "name_refs",
        "name_nodes",
        "trigrams",
        "tokens_words",
        "imports",
    ] {
        let stats = if let Ok(t) =
            txn.open_multimap_table(redb::MultimapTableDefinition::<&str, &str>::new(name))
        {
            t.stats().ok()
        } else if let Ok(t) =
            txn.open_multimap_table(redb::MultimapTableDefinition::<&str, &[u8]>::new(name))
        {
            t.stats().ok()
        } else if let Ok(t) = txn.open_table(redb::TableDefinition::<&str, &[u8]>::new(name)) {
            t.stats().ok()
        } else if let Ok(t) = txn.open_table(redb::TableDefinition::<&str, &str>::new(name)) {
            t.stats().ok()
        } else if let Ok(t) =
            txn.open_multimap_table(redb::MultimapTableDefinition::<&str, u32>::new(name))
        {
            t.stats().ok()
        } else if let Ok(t) = txn.open_table(redb::TableDefinition::<u32, &str>::new(name)) {
            t.stats().ok()
        } else if let Ok(t) = txn.open_table(redb::TableDefinition::<&str, u32>::new(name)) {
            t.stats().ok()
        } else {
            None
        };
        if let Some(s) = stats {
            let bytes = s.stored_bytes();
            rows.push((name, bytes));
        }
    }
    rows.sort_by_key(|r| std::cmp::Reverse(r.1));
    let total: u64 = rows.iter().map(|r| r.1).sum();
    for (name, bytes) in rows {
        println!(
            "{name:>12}: {:>8.1} MB ({:>4.1}%)",
            bytes as f64 / 1e6,
            bytes as f64 * 100.0 / total as f64
        );
    }
    println!(
        "{:>12}: {:>8.1} MB stored (file may be larger: pages/fragmentation)",
        "TOTAL",
        total as f64 / 1e6
    );
}