use crate::DbkitError;
use crate::analytical::RecordBatch;
use crate::value::DbValue;
use async_trait::async_trait;
#[cfg(feature = "clickhouse")]
pub mod clickhouse;
#[async_trait]
pub trait RemoteSource: Send + Sync {
async fn query_arrow(
&self,
sql: &str,
params: &[DbValue],
) -> Result<Vec<RecordBatch>, DbkitError>;
}
#[cfg(feature = "_read-typed")]
#[async_trait]
pub trait RemoteSourceExt: RemoteSource {
async fn query_as<T>(&self, sql: &str, params: &[DbValue]) -> Result<Vec<T>, DbkitError>
where
T: serde::de::DeserializeOwned,
{
let batches = self.query_arrow(sql, params).await?;
crate::analytical::deserialize_batches(&batches)
}
}
#[cfg(feature = "_read-typed")]
impl<S: RemoteSource + ?Sized> RemoteSourceExt for S {}
#[async_trait]
pub trait RemoteSink: Send + Sync {
async fn write_arrow(
&self,
table: &str,
batches: Vec<RecordBatch>,
) -> Result<(), DbkitError>;
}
#[cfg(feature = "_read-typed")]
#[async_trait]
pub trait RemoteSinkExt: RemoteSink {
async fn write_rows<T>(&self, table: &str, rows: &[T]) -> Result<(), DbkitError>
where
T: serde::Serialize + Sync,
{
if rows.is_empty() {
return Ok(());
}
let batch = crate::analytical::serialize_rows(rows)?;
self.write_arrow(table, vec![batch]).await
}
}
#[cfg(feature = "_read-typed")]
impl<S: RemoteSink + ?Sized> RemoteSinkExt for S {}