libsql 0.9.18

The libSQL database library
Documentation
use crate::{
    local::{self},
    params::Params,
    statement::Stmt,
    sync::SyncContext, Column, Result, Rows, Statement,
};
use std::sync::{atomic::{AtomicBool, Ordering}, Arc};
use tokio::sync::Mutex;

pub struct SyncedStatement {
    pub conn: local::Connection,
    pub inner: Statement,
    pub context: Arc<Mutex<SyncContext>>,
    pub needs_pull: Arc<AtomicBool>,
}

#[async_trait::async_trait]
impl Stmt for SyncedStatement {
    fn finalize(&mut self) {
        self.inner.finalize()
    }

    async fn execute(&mut self, params: &Params) -> Result<usize> {
        if self.needs_pull.load(Ordering::Relaxed) {
            let mut context = self.context.lock().await;
            crate::sync::try_pull(&mut context, &self.conn).await?;
            self.needs_pull.store(false, Ordering::Relaxed);
        }
        self.inner.execute(params).await
    }

    async fn query(&mut self, params: &Params) -> Result<Rows> {
        if self.needs_pull.load(Ordering::Relaxed) {
            let mut context = self.context.lock().await;
            crate::sync::try_pull(&mut context, &self.conn).await?;
            self.needs_pull.store(false, Ordering::Relaxed);
        }
        self.inner.query(params).await
    }

    async fn run(&mut self, params: &Params) -> Result<()> {
        if self.needs_pull.load(Ordering::Relaxed) {
            let mut context = self.context.lock().await;
            crate::sync::try_pull(&mut context, &self.conn).await?;
            self.needs_pull.store(false, Ordering::Relaxed);
        }
        self.inner.run(params).await
    }

    fn interrupt(&mut self) -> Result<()> {
        self.inner.interrupt()
    }

    fn reset(&mut self) {
        self.inner.reset()
    }

    fn parameter_count(&self) -> usize {
        self.inner.parameter_count()
    }

    fn parameter_name(&self, idx: i32) -> Option<&str> {
        self.inner.parameter_name(idx)
    }

    fn column_count(&self) -> usize {
        self.inner.column_count()
    }

    fn columns(&self) -> Vec<Column> {
        self.inner.columns()
    }
}