ubiquity-database 0.1.1

Database abstraction layer for Ubiquity supporting SQLite and Astra DB
Documentation
//! Database abstraction layer for Ubiquity
//! 
//! Supports both SQLite for local development and Astra DB for cloud/enterprise deployments.
//! 
//! # Features
//! - Unified interface for both database backends
//! - Vector embeddings for consciousness tracking
//! - Hybrid search combining vector and structured queries
//! - 7-wide memory pools for parallel processing
//! - Pub/sub messaging for worker coordination

pub mod traits;
pub mod sqlite;
pub mod error;
pub mod config;
pub mod embeddings;
pub mod memory_pools;

#[cfg(feature = "astra")]
pub mod astra;

pub use traits::*;
pub use error::*;
pub use config::*;
pub use embeddings::*;
pub use memory_pools::*;

use async_trait::async_trait;
use std::sync::Arc;

/// Database backend selection
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum DatabaseBackend {
    Sqlite,
    #[cfg(feature = "astra")]
    Astra,
}

/// Create a database connection based on configuration
pub async fn create_database(config: DatabaseConfig) -> Result<Arc<dyn Database>, DatabaseError> {
    match config.backend {
        DatabaseBackend::Sqlite => {
            let db = sqlite::SqliteDatabase::new(config).await?;
            Ok(Arc::new(db))
        }
        #[cfg(feature = "astra")]
        DatabaseBackend::Astra => {
            let db = astra::AstraDatabase::new(config).await?;
            Ok(Arc::new(db))
        }
    }
}

/// Create a memory pool manager based on configuration
pub async fn create_memory_pools(config: DatabaseConfig) -> Result<Arc<dyn MemoryPoolManager>, DatabaseError> {
    match config.backend {
        DatabaseBackend::Sqlite => {
            let pools = memory_pools::SqliteMemoryPools::new(config).await?;
            Ok(Arc::new(pools))
        }
        #[cfg(feature = "astra")]
        DatabaseBackend::Astra => {
            let pools = memory_pools::AstraMemoryPools::new(config).await?;
            Ok(Arc::new(pools))
        }
    }
}

#[cfg(test)]
mod tests;