type-bridge-orm 2.2.1

Async ORM for TypeDB built on type-bridge-core-lib
Documentation
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};

use type_bridge_orm::session::backend::{BoxFuture, DriverBackend, TransactionOps};
use type_bridge_orm::{Database, OrmError, TxType};

struct CloseTrackingBackend {
    close_calls: Arc<AtomicUsize>,
}

impl DriverBackend for CloseTrackingBackend {
    fn open_transaction(
        &self,
        _database: &str,
        _tx_type: TxType,
    ) -> BoxFuture<'_, Result<Box<dyn TransactionOps>, OrmError>> {
        Box::pin(async { Err(OrmError::Transaction("not used by close test".to_owned())) })
    }

    fn is_open(&self) -> bool {
        true
    }

    fn close_connection(&self) -> Result<(), OrmError> {
        self.close_calls.fetch_add(1, Ordering::SeqCst);
        Ok(())
    }
}

#[test]
fn database_close_delegates_and_remains_repeatable() {
    let close_calls = Arc::new(AtomicUsize::new(0));
    let database = Database::with_backend(
        Box::new(CloseTrackingBackend {
            close_calls: Arc::clone(&close_calls),
        }),
        "close-test",
    );

    database.close().expect("first close should delegate");
    database
        .close()
        .expect("repeated close should delegate safely");

    assert_eq!(close_calls.load(Ordering::SeqCst), 2);
}