stately_arrow/
database.rs1#[cfg(feature = "clickhouse")]
3pub mod clickhouse;
4
5use serde::{Deserialize, Serialize};
6
7#[cfg(feature = "clickhouse")]
10pub type DefaultQuerySessionContext = clickhouse::QuerySessionContext;
11#[cfg(not(feature = "clickhouse"))]
14pub type DefaultQuerySessionContext = datafusion::execution::context::SessionContext;
15
16#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema)]
19#[schema(as = DatabaseConfiguration)]
20pub struct Config {
21 pub options: ConnectionOptions,
22 pub driver: Database,
23 #[serde(default)]
24 pub pool: PoolOptions,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema)]
30pub struct ConnectionOptions {
31 pub endpoint: String,
33 pub username: String,
35 #[serde(skip_serializing_if = "Option::is_none")]
37 #[schema(value_type = String)]
38 pub password: Option<Secret>,
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub tls: Option<TlsOptions>,
42 #[serde(default)]
44 #[schema(default = false)]
45 pub check: bool,
46}
47
48#[derive(
50 Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema,
51)]
52pub struct PoolOptions {
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub connect_timeout: Option<u16>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub transaction_timeout: Option<u16>,
57 #[serde(skip_serializing_if = "Option::is_none")]
60 pub pool_size: Option<u32>,
61}
62
63#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema)]
65pub struct TlsOptions {
66 #[serde(default)]
67 #[schema(default = false)]
68 pub enable: bool,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub domain: Option<String>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub cafile: Option<String>,
73}
74
75#[non_exhaustive]
80#[allow(missing_copy_implementations)] #[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, utoipa::ToSchema)]
82#[cfg_attr(feature = "strum", derive(strum_macros::AsRefStr))]
83#[serde(rename_all = "snake_case")]
84pub enum Database {
85 #[cfg(feature = "clickhouse")]
86 #[serde(rename = "clickhouse", alias = "click_house")]
87 ClickHouse(
88 #[serde(default, skip_serializing_if = "Option::is_none")]
89 Option<clickhouse::ClickHouseConfig>,
90 ),
91}
92
93#[derive(Clone, Default, PartialEq, Eq, Hash, Deserialize, utoipa::ToSchema)]
109#[schema(value_type = String)]
110pub struct Secret(String);
111
112impl Secret {
113 pub fn new<P: AsRef<str>>(s: P) -> Self { Self(s.as_ref().to_string()) }
114
115 #[must_use]
116 pub fn get(&self) -> &str { &self.0 }
117}
118
119impl std::fmt::Debug for Secret {
120 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
121 write!(f, "Secret(*****)")
122 }
123}
124
125impl<T: AsRef<str>> From<T> for Secret {
126 fn from(s: T) -> Self { Self(s.as_ref().to_string()) }
127}
128
129impl Serialize for Secret {
130 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
131 where
132 S: serde::Serializer,
133 {
134 serializer.serialize_str(self.get())
135 }
136}