use std::path::PathBuf;
use std::time::Duration;
const DEFAULT_SQL_BUSY_TIMEOUT_MS: u64 = 5000;
const DEFAULT_SQL_QUERY_TIMEOUT_MS: u64 = 5000;
const DEFAULT_SQL_JOURNAL_MODE: &str = "WAL";
pub fn base_dir() -> Result<PathBuf, String> {
if let Some(v) = std::env::var_os("AGENT_BLOCK_HOME") {
return Ok(PathBuf::from(v));
}
let home = std::env::var_os("HOME").ok_or_else(|| "HOME env var not set".to_string())?;
Ok(PathBuf::from(home).join(".agent-block"))
}
pub fn kv_path() -> Result<PathBuf, String> {
if let Some(v) = std::env::var_os("AGENT_BLOCK_KV_PATH") {
return Ok(PathBuf::from(v));
}
Ok(base_dir()?.join("kv.sqlite"))
}
pub fn sql_path() -> Result<PathBuf, String> {
if let Some(v) = std::env::var_os("AGENT_BLOCK_SQL_PATH") {
return Ok(PathBuf::from(v));
}
Ok(base_dir()?.join("db.sqlite"))
}
pub fn is_memory_sql(path: &std::path::Path) -> bool {
path.as_os_str() == ":memory:"
}
pub fn sql_busy_timeout() -> Duration {
let ms = std::env::var("AGENT_BLOCK_SQL_BUSY_TIMEOUT_MS")
.ok()
.and_then(|s| s.parse::<u64>().ok())
.unwrap_or(DEFAULT_SQL_BUSY_TIMEOUT_MS);
Duration::from_millis(ms)
}
pub fn sql_journal_mode() -> String {
std::env::var("AGENT_BLOCK_SQL_JOURNAL_MODE")
.unwrap_or_else(|_| DEFAULT_SQL_JOURNAL_MODE.to_string())
}
pub fn sql_query_timeout() -> Option<Duration> {
let ms = std::env::var("AGENT_BLOCK_SQL_QUERY_TIMEOUT_MS")
.ok()
.and_then(|s| s.parse::<u64>().ok())
.unwrap_or(DEFAULT_SQL_QUERY_TIMEOUT_MS);
if ms == 0 {
None
} else {
Some(Duration::from_millis(ms))
}
}