#[cfg(feature = "clickhouse")]
pub mod clickhouse;
use serde::{Deserialize, Serialize};
#[cfg(feature = "clickhouse")]
pub type DefaultQuerySessionContext = clickhouse::QuerySessionContext;
#[cfg(not(feature = "clickhouse"))]
pub type DefaultQuerySessionContext = datafusion::execution::context::SessionContext;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema)]
#[schema(as = DatabaseConfiguration)]
pub struct Config {
pub options: ConnectionOptions,
pub driver: Database,
#[serde(default)]
pub pool: PoolOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema)]
pub struct ConnectionOptions {
pub endpoint: String,
pub username: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String)]
pub password: Option<Secret>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tls: Option<TlsOptions>,
#[serde(default)]
#[schema(default = false)]
pub check: bool,
}
#[derive(
Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema,
)]
pub struct PoolOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub connect_timeout: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transaction_timeout: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pool_size: Option<u32>,
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema)]
pub struct TlsOptions {
#[serde(default)]
#[schema(default = false)]
pub enable: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cafile: Option<String>,
}
#[non_exhaustive]
#[allow(missing_copy_implementations)] #[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema)]
#[cfg_attr(feature = "strum", derive(strum_macros::AsRefStr))]
#[serde(rename_all = "snake_case")]
pub enum Database {
#[cfg(feature = "clickhouse")]
#[serde(rename = "clickhouse", alias = "click_house")]
ClickHouse(
#[serde(default, skip_serializing_if = "Option::is_none")]
Option<clickhouse::ClickHouseConfig>,
),
}
#[derive(Clone, Default, PartialEq, Eq, Hash, Deserialize, utoipa::ToSchema)]
#[schema(value_type = String)]
pub struct Secret(String);
impl Secret {
pub fn new<P: AsRef<str>>(s: P) -> Self { Self(s.as_ref().to_string()) }
#[must_use]
pub fn get(&self) -> &str { &self.0 }
}
impl std::fmt::Debug for Secret {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Secret(*****)")
}
}
impl<T: AsRef<str>> From<T> for Secret {
fn from(s: T) -> Self { Self(s.as_ref().to_string()) }
}
impl Serialize for Secret {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(self.get())
}
}