Skip to main content

ubiquity_database/
lib.rs

1//! Database abstraction layer for Ubiquity
2//! 
3//! Supports both SQLite for local development and Astra DB for cloud/enterprise deployments.
4//! 
5//! # Features
6//! - Unified interface for both database backends
7//! - Vector embeddings for consciousness tracking
8//! - Hybrid search combining vector and structured queries
9//! - 7-wide memory pools for parallel processing
10//! - Pub/sub messaging for worker coordination
11
12pub mod traits;
13pub mod sqlite;
14pub mod error;
15pub mod config;
16pub mod embeddings;
17pub mod memory_pools;
18
19#[cfg(feature = "astra")]
20pub mod astra;
21
22pub use traits::*;
23pub use error::*;
24pub use config::*;
25pub use embeddings::*;
26pub use memory_pools::*;
27
28use async_trait::async_trait;
29use std::sync::Arc;
30
31/// Database backend selection
32#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
33#[serde(rename_all = "lowercase")]
34pub enum DatabaseBackend {
35    Sqlite,
36    #[cfg(feature = "astra")]
37    Astra,
38}
39
40/// Create a database connection based on configuration
41pub async fn create_database(config: DatabaseConfig) -> Result<Arc<dyn Database>, DatabaseError> {
42    match config.backend {
43        DatabaseBackend::Sqlite => {
44            let db = sqlite::SqliteDatabase::new(config).await?;
45            Ok(Arc::new(db))
46        }
47        #[cfg(feature = "astra")]
48        DatabaseBackend::Astra => {
49            let db = astra::AstraDatabase::new(config).await?;
50            Ok(Arc::new(db))
51        }
52    }
53}
54
55/// Create a memory pool manager based on configuration
56pub async fn create_memory_pools(config: DatabaseConfig) -> Result<Arc<dyn MemoryPoolManager>, DatabaseError> {
57    match config.backend {
58        DatabaseBackend::Sqlite => {
59            let pools = memory_pools::SqliteMemoryPools::new(config).await?;
60            Ok(Arc::new(pools))
61        }
62        #[cfg(feature = "astra")]
63        DatabaseBackend::Astra => {
64            let pools = memory_pools::AstraMemoryPools::new(config).await?;
65            Ok(Arc::new(pools))
66        }
67    }
68}
69
70#[cfg(test)]
71mod tests;