switchy_database 0.5.0

Switchy database package
#![cfg(any(feature = "sqlite-rusqlite", feature = "turso"))]

#[cfg(feature = "sqlite-rusqlite")]
use std::sync::Arc;
use switchy_database::Database;
#[cfg(feature = "sqlite-rusqlite")]
use switchy_database::{DatabaseValue, rusqlite::RusqliteDatabase};

#[cfg(feature = "turso")]
#[tokio::test]
async fn turso_typed_maintenance() {
    let db = switchy_database::turso::TursoDatabase::new(":memory:")
        .await
        .unwrap();
    db.check_connection().await.unwrap();
    db.sqlite_temp_store_memory().await.unwrap();
    let transaction = db.begin_transaction().await.unwrap();
    transaction.sqlite_temp_store_memory().await.unwrap();
    transaction.rollback().await.unwrap();
    assert!(!db.sqlite_integrity_check().await.unwrap().is_empty());
    assert!(matches!(
        db.sqlite_foreign_key_check().await,
        Err(switchy_database::DatabaseError::UnsupportedOperation(_))
    ));
    assert_eq!(db.sqlite_checkpoint_truncate().await.unwrap().len(), 1);
    db.close().await.unwrap();
    assert!(db.check_connection().await.is_err());
}

#[cfg(feature = "sqlite-rusqlite")]
#[tokio::test]
async fn typed_maintenance_preserves_results_and_closed_errors() {
    let db = RusqliteDatabase::new(vec![Arc::new(switchy_async::sync::Mutex::new(
        rusqlite::Connection::open_in_memory().unwrap(),
    ))]);
    db.check_connection().await.unwrap();
    db.sqlite_temp_store_memory().await.unwrap();
    let rows = db.sqlite_integrity_check().await.unwrap();
    assert_eq!(rows.len(), 1);
    assert_eq!(
        rows[0].get("integrity_check"),
        Some(DatabaseValue::String("ok".into()))
    );
    assert!(db.sqlite_foreign_key_check().await.unwrap().is_empty());
    let rows = db.sqlite_checkpoint_truncate().await.unwrap();
    assert_eq!(rows.len(), 1);
    assert_eq!(rows[0].get("busy"), Some(DatabaseValue::Int64(0)));
    db.close().await.unwrap();
    assert!(db.check_connection().await.is_err());
    assert!(db.sqlite_integrity_check().await.is_err());
}