soar_db/lib.rs
1//! Database layer for the soar package manager.
2//!
3//! This crate provides database management for soar, including:
4//!
5//! - **Connection management**: Separate connections for core and metadata databases
6//! - **Models**: Diesel ORM models for all database tables
7//! - **Repositories**: Type-safe CRUD operations using the repository pattern
8//! - **Migrations**: Automatic schema migrations using diesel_migrations
9//!
10//! # Database Architecture
11//!
12//! Soar uses two types of SQLite databases:
13//!
14//! - **Core database** (`core.db`): Tracks installed packages
15//! - **Metadata databases** (one per repository): Contains package metadata
16//!
17//! # Example
18//!
19//! ```ignore
20//! use soar_db::connection::DatabaseManager;
21//! use soar_db::repository::core::CoreRepository;
22//! use soar_db::repository::metadata::MetadataRepository;
23//!
24//! // Create database manager
25//! let mut manager = DatabaseManager::new("/path/to/db")?;
26//!
27//! // Add repository metadata
28//! manager.add_metadata_db("pkgforge", "/path/to/pkgforge.db")?;
29//!
30//! // Query installed packages (DbConnection derefs to SqliteConnection)
31//! let installed = CoreRepository::list_all(manager.core())?;
32//!
33//! // Search for packages
34//! if let Some(metadata) = manager.metadata("pkgforge") {
35//! let packages = MetadataRepository::search(metadata, "firefox")?;
36//! }
37//! ```
38
39pub mod connection;
40pub mod error;
41pub mod migration;
42pub mod models;
43pub mod repository;
44pub mod schema;
45
46/// Helper macro to convert `Option<serde_json::Value>` to `Option<Vec<T>>`.
47#[macro_export]
48macro_rules! json_vec {
49 ($val:expr) => {
50 $val.map(|v| serde_json::from_value(v).unwrap_or_default())
51 };
52}