Skip to main content

litellm_rs/storage/database/
mod.rs

1//! Database storage implementation using SeaORM
2//!
3//! This module provides database connectivity and operations using SeaORM ORM.
4
5// SeaORM implementation
6/// Database entities module
7pub mod entities;
8/// Database migration module
9pub mod migration;
10/// SeaORM database implementation module
11pub mod seaorm_db;
12
13// Re-export the main database interface
14pub use seaorm_db::SeaOrmDatabase as Database;
15pub use seaorm_db::{
16    DatabaseBackendType, DatabaseStats, RequestLedgerListFilter, RequestLedgerSink,
17    SeaOrmTeamRepository,
18};
19
20/// Returns the default absolute path for the SQLite fallback database.
21///
22/// Resolution order:
23/// 1. `LITELLM_SQLITE_PATH` explicit file override (if set and non-empty)
24/// 2. `LITELLM_DATA_DIR/gateway.db` (if `LITELLM_DATA_DIR` is set and non-empty)
25/// 3. `<data_local_dir>/litellm-rs/gateway.db` (platform-specific)
26/// 4. `/tmp/litellm-rs/gateway.db` (ultimate fallback)
27pub fn default_sqlite_path() -> std::path::PathBuf {
28    if let Ok(p) = std::env::var("LITELLM_SQLITE_PATH")
29        && !p.is_empty()
30    {
31        return std::path::PathBuf::from(p);
32    }
33    super::default_data_dir().join("gateway.db")
34}
35
36#[cfg(test)]
37mod tests {
38    use super::default_sqlite_path;
39    use std::path::PathBuf;
40
41    struct EnvRestore {
42        sqlite_path: Option<String>,
43        data_dir: Option<String>,
44    }
45
46    impl EnvRestore {
47        fn capture() -> Self {
48            Self {
49                sqlite_path: std::env::var("LITELLM_SQLITE_PATH").ok(),
50                data_dir: std::env::var("LITELLM_DATA_DIR").ok(),
51            }
52        }
53    }
54
55    impl Drop for EnvRestore {
56        fn drop(&mut self) {
57            unsafe {
58                match &self.sqlite_path {
59                    Some(value) => std::env::set_var("LITELLM_SQLITE_PATH", value),
60                    None => std::env::remove_var("LITELLM_SQLITE_PATH"),
61                }
62                match &self.data_dir {
63                    Some(value) => std::env::set_var("LITELLM_DATA_DIR", value),
64                    None => std::env::remove_var("LITELLM_DATA_DIR"),
65                }
66            }
67        }
68    }
69
70    #[test]
71    fn default_sqlite_path_uses_shared_data_dir() {
72        let _guard = crate::storage::ENV_LOCK.lock().unwrap();
73        let _restore = EnvRestore::capture();
74        unsafe {
75            std::env::remove_var("LITELLM_SQLITE_PATH");
76            std::env::set_var("LITELLM_DATA_DIR", "/custom/litellm-state");
77        }
78
79        assert_eq!(
80            default_sqlite_path(),
81            PathBuf::from("/custom/litellm-state/gateway.db")
82        );
83    }
84
85    #[test]
86    fn default_sqlite_path_explicit_override_wins() {
87        let _guard = crate::storage::ENV_LOCK.lock().unwrap();
88        let _restore = EnvRestore::capture();
89        unsafe {
90            std::env::set_var("LITELLM_SQLITE_PATH", "/explicit/gateway.db");
91            std::env::set_var("LITELLM_DATA_DIR", "/custom/litellm-state");
92        }
93
94        assert_eq!(default_sqlite_path(), PathBuf::from("/explicit/gateway.db"));
95    }
96}