use deadpool::managed::{BuildError, PoolError};
use duckdb::Error as DuckdbError;
use martin_tile_utils::TileCoord;
use tokio::task::JoinError;
use crate::tiles::UrlQuery;
use crate::tiles::duckdb::pool::DuckDBPoolTarget;
pub type DuckDBResult<T> = Result<T, DuckDBError>;
#[derive(thiserror::Error, Debug)]
pub enum DuckDBPoolManagerError {
#[error("DuckDB pool creation failed: {0}")]
Join(#[from] JoinError),
#[error("Unable to open DuckDB connection for {target}: {source}")]
Open {
#[source]
source: Box<DuckdbError>,
target: Box<DuckDBPoolTarget>,
},
#[error("Unable to load DuckDB extension {extension} for {target}: {source}")]
LoadExtension {
#[source]
source: Box<DuckdbError>,
extension: &'static str,
target: Box<DuckDBPoolTarget>,
},
#[error("Unable to apply DuckDB setting {setting}={value} for {target}: {source}")]
ApplySetting {
#[source]
source: Box<DuckdbError>,
setting: &'static str,
value: String,
target: Box<DuckDBPoolTarget>,
},
#[error("Unable to apply DuckDB setting threads={0}: value is too large")]
InvalidThreadCount(usize),
#[error("DuckDB connection health check failed for {target}: {source}")]
HealthCheck {
#[source]
source: Box<DuckdbError>,
target: Box<DuckDBPoolTarget>,
},
}
#[non_exhaustive]
#[derive(thiserror::Error, Debug)]
pub enum DuckDBError {
#[error("Unable to build DuckDB pool {1}: {0}")]
DuckDBPoolBuildError(#[source] BuildError, String),
#[error("Unable to get a DuckDB connection from pool {1}: {0}")]
DuckDBPoolConnError(#[source] PoolError<DuckDBPoolManagerError>, String),
#[error("DuckDB blocking task failed while {1}: {0}")]
DuckDBTaskJoinError(#[source] JoinError, &'static str),
#[error(
"Error preparing DuckDB query for tile source '{source_id}' ({signature}): {query} {source}"
)]
PrepareQueryError {
#[source]
source: Box<DuckdbError>,
source_id: String,
signature: String,
query: String,
},
#[error(r"Unable to get tile {2:#} from DuckDB source {1}: {0}")]
GetTileError(#[source] Box<DuckdbError>, String, TileCoord),
#[error(r"Unable to get tile {2:#} with query params from DuckDB source {1}: {0}")]
GetTileWithQueryError(
#[source] Box<DuckdbError>,
String,
TileCoord,
Option<UrlQuery>,
),
}