pub mod entities;
pub mod migration;
pub mod seaorm_db;
pub use seaorm_db::SeaOrmDatabase as Database;
pub use seaorm_db::{DatabaseBackendType, DatabaseStats, SeaOrmTeamRepository};
pub fn default_sqlite_path() -> std::path::PathBuf {
if let Ok(p) = std::env::var("LITELLM_SQLITE_PATH")
&& !p.is_empty()
{
return std::path::PathBuf::from(p);
}
super::default_data_dir().join("gateway.db")
}
#[cfg(test)]
mod tests {
use super::default_sqlite_path;
use std::path::PathBuf;
struct EnvRestore {
sqlite_path: Option<String>,
data_dir: Option<String>,
}
impl EnvRestore {
fn capture() -> Self {
Self {
sqlite_path: std::env::var("LITELLM_SQLITE_PATH").ok(),
data_dir: std::env::var("LITELLM_DATA_DIR").ok(),
}
}
}
impl Drop for EnvRestore {
fn drop(&mut self) {
unsafe {
match &self.sqlite_path {
Some(value) => std::env::set_var("LITELLM_SQLITE_PATH", value),
None => std::env::remove_var("LITELLM_SQLITE_PATH"),
}
match &self.data_dir {
Some(value) => std::env::set_var("LITELLM_DATA_DIR", value),
None => std::env::remove_var("LITELLM_DATA_DIR"),
}
}
}
}
#[test]
fn default_sqlite_path_uses_shared_data_dir() {
let _guard = crate::storage::ENV_LOCK.lock().unwrap();
let _restore = EnvRestore::capture();
unsafe {
std::env::remove_var("LITELLM_SQLITE_PATH");
std::env::set_var("LITELLM_DATA_DIR", "/custom/litellm-state");
}
assert_eq!(
default_sqlite_path(),
PathBuf::from("/custom/litellm-state/gateway.db")
);
}
#[test]
fn default_sqlite_path_explicit_override_wins() {
let _guard = crate::storage::ENV_LOCK.lock().unwrap();
let _restore = EnvRestore::capture();
unsafe {
std::env::set_var("LITELLM_SQLITE_PATH", "/explicit/gateway.db");
std::env::set_var("LITELLM_DATA_DIR", "/custom/litellm-state");
}
assert_eq!(default_sqlite_path(), PathBuf::from("/explicit/gateway.db"));
}
}