use crate::error::{NpcError, Result};
use sqlx::AnyPool;
pub struct DbPool {
pool: AnyPool,
}
impl DbPool {
pub async fn connect(url: &str) -> Result<Self> {
let pool = AnyPool::connect(url)
.await
.map_err(|e| NpcError::Other(format!("DB connect: {}", e)))?;
Ok(Self { pool })
}
pub async fn connect_sqlite(path: &str) -> Result<Self> {
let url = if path == ":memory:" {
"sqlite::memory:".to_string()
} else {
format!("sqlite://{}?mode=rwc", path)
};
Self::connect(&url).await
}
pub fn pool(&self) -> &AnyPool {
&self.pool
}
pub async fn execute(&self, sql: &str) -> Result<u64> {
let result = sqlx::query(sql)
.execute(&self.pool)
.await
.map_err(|e| NpcError::Other(format!("DB execute: {}", e)))?;
Ok(result.rows_affected())
}
pub async fn execute_batch(&self, sql: &str) -> Result<()> {
for statement in sql.split(';') {
let trimmed = statement.trim();
if trimmed.is_empty() {
continue;
}
sqlx::query(trimmed)
.execute(&self.pool)
.await
.map_err(|e| NpcError::Other(format!("DB batch: {}", e)))?;
}
Ok(())
}
}