sqlitegraph 2.2.3

Embedded graph database with full ACID transactions, HNSW vector search, dual backend support, and comprehensive graph algorithms library
Documentation
use std::sync::atomic::{AtomicU64, Ordering};

use super::metrics_snapshot::GraphMetricsSnapshot;

#[derive(Default)]
pub struct GraphMetrics {
    prepares: AtomicU64,
    executes: AtomicU64,
    tx_begin: AtomicU64,
    tx_commit: AtomicU64,
    tx_rollback: AtomicU64,
    prepare_cache_hits: AtomicU64,
    prepare_cache_misses: AtomicU64,
}

impl GraphMetrics {
    pub fn snapshot(&self) -> GraphMetricsSnapshot {
        GraphMetricsSnapshot {
            prepare_count: self.prepares.load(Ordering::Relaxed),
            execute_count: self.executes.load(Ordering::Relaxed),
            tx_begin_count: self.tx_begin.load(Ordering::Relaxed),
            tx_commit_count: self.tx_commit.load(Ordering::Relaxed),
            tx_rollback_count: self.tx_rollback.load(Ordering::Relaxed),
            prepare_cache_hits: self.prepare_cache_hits.load(Ordering::Relaxed),
            prepare_cache_misses: self.prepare_cache_misses.load(Ordering::Relaxed),
        }
    }

    pub fn reset(&self) {
        self.prepares.store(0, Ordering::Relaxed);
        self.executes.store(0, Ordering::Relaxed);
        self.tx_begin.store(0, Ordering::Relaxed);
        self.tx_commit.store(0, Ordering::Relaxed);
        self.tx_rollback.store(0, Ordering::Relaxed);
        self.prepare_cache_hits.store(0, Ordering::Relaxed);
        self.prepare_cache_misses.store(0, Ordering::Relaxed);
    }

    pub fn record_prepare(&self) {
        self.prepares.fetch_add(1, Ordering::Relaxed);
    }

    pub fn record_execute(&self, sql: Option<&str>) {
        self.executes.fetch_add(1, Ordering::Relaxed);
        if let Some(keyword) = sql.and_then(super::utils::leading_keyword) {
            if keyword.eq_ignore_ascii_case("BEGIN") {
                self.tx_begin.fetch_add(1, Ordering::Relaxed);
            } else if keyword.eq_ignore_ascii_case("COMMIT") {
                self.tx_commit.fetch_add(1, Ordering::Relaxed);
            } else if keyword.eq_ignore_ascii_case("ROLLBACK") {
                self.tx_rollback.fetch_add(1, Ordering::Relaxed);
            }
        }
    }

    pub fn record_prepare_cache_hit(&self) {
        self.prepare_cache_hits.fetch_add(1, Ordering::Relaxed);
    }

    pub fn record_prepare_cache_miss(&self) {
        self.prepare_cache_misses.fetch_add(1, Ordering::Relaxed);
        self.record_prepare();
    }
}