use crate::error::Result;
use super::config::Config;
use super::database::Database;
pub async fn connect(config: &Config) -> Result<Database> {
if let Some(parent) = std::path::Path::new(&config.path).parent()
&& !parent.as_os_str().is_empty()
{
tokio::fs::create_dir_all(parent).await.map_err(|e| {
crate::error::Error::internal(format!(
"failed to create database directory: {parent:?}"
))
.chain(e)
})?;
}
let db = libsql::Builder::new_local(&config.path)
.build()
.await
.map_err(crate::error::Error::from)?;
let conn = db.connect().map_err(crate::error::Error::from)?;
conn.query(
&format!("PRAGMA journal_mode={}", config.journal_mode.as_str()),
(),
)
.await
.map_err(crate::error::Error::from)?;
conn.query(
&format!("PRAGMA synchronous={}", config.synchronous.as_str()),
(),
)
.await
.map_err(crate::error::Error::from)?;
conn.query(&format!("PRAGMA busy_timeout={}", config.busy_timeout), ())
.await
.map_err(crate::error::Error::from)?;
conn.query(&format!("PRAGMA cache_size=-{}", config.cache_size), ())
.await
.map_err(crate::error::Error::from)?;
conn.query(&format!("PRAGMA mmap_size={}", config.mmap_size), ())
.await
.map_err(crate::error::Error::from)?;
conn.query(
&format!(
"PRAGMA foreign_keys={}",
if config.foreign_keys { "ON" } else { "OFF" }
),
(),
)
.await
.map_err(crate::error::Error::from)?;
conn.query(
&format!("PRAGMA temp_store={}", config.temp_store.as_str()),
(),
)
.await
.map_err(crate::error::Error::from)?;
if let Some(ref migrations_dir) = config.migrations {
super::migrate::migrate(&conn, migrations_dir).await?;
}
Ok(Database::new(db, conn))
}