database_mcp_sqlite/
adapter.rs1use database_mcp_config::DatabaseConfig;
4use database_mcp_server::AppError;
5use sqlx::SqlitePool;
6use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions};
7use tracing::info;
8
9#[derive(Clone)]
11pub struct SqliteAdapter {
12 pub(crate) config: DatabaseConfig,
13 pub(crate) pool: SqlitePool,
14}
15
16impl std::fmt::Debug for SqliteAdapter {
17 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18 f.debug_struct("SqliteAdapter")
19 .field("read_only", &self.config.read_only)
20 .finish_non_exhaustive()
21 }
22}
23
24impl SqliteAdapter {
25 pub async fn new(config: &DatabaseConfig) -> Result<Self, AppError> {
31 let name = config.name.as_deref().unwrap_or_default();
32 let pool = SqlitePoolOptions::new()
33 .max_connections(1) .connect_with(connect_options(config))
35 .await
36 .map_err(|e| AppError::Connection(format!("Failed to open SQLite: {e}")))?;
37
38 info!("SQLite connection initialized: {name}");
39
40 Ok(Self {
41 config: config.clone(),
42 pool,
43 })
44 }
45
46 pub(crate) fn quote_identifier(name: &str) -> String {
48 database_mcp_sql::identifier::quote_identifier(name, '"')
49 }
50}
51
52fn connect_options(config: &DatabaseConfig) -> SqliteConnectOptions {
54 let name = config.name.as_deref().unwrap_or_default();
55 SqliteConnectOptions::new().filename(name)
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61 use database_mcp_config::DatabaseBackend;
62
63 #[test]
64 fn try_from_sets_filename() {
65 let config = DatabaseConfig {
66 backend: DatabaseBackend::Sqlite,
67 name: Some("test.db".into()),
68 ..DatabaseConfig::default()
69 };
70 let opts = connect_options(&config);
71
72 assert_eq!(opts.get_filename().to_str().expect("valid path"), "test.db");
73 }
74
75 #[test]
76 fn try_from_empty_name_defaults() {
77 let config = DatabaseConfig {
78 backend: DatabaseBackend::Sqlite,
79 name: None,
80 ..DatabaseConfig::default()
81 };
82 let opts = connect_options(&config);
83
84 assert_eq!(opts.get_filename().to_str().expect("valid path"), "");
86 }
87}