Crates.io | opensrv-clickhouse |
lib.rs | opensrv-clickhouse |
version | 0.7.0 |
source | src |
created_at | 2022-06-14 15:29:59.209388 |
updated_at | 2024-02-21 16:30:32.344255 |
description | Bindings for emulating a ClickHouse server. |
homepage | |
repository | https://github.com/datafuselabs/opensrv |
max_upload_size | |
id | 605904 |
size | 436,530 |
Bindings for emulating a ClickHouse server.
See the full example here
struct Session {
last_progress_send: Instant,
metadata: ClickHouseMetadata,
}
#[async_trait::async_trait]
impl opensrv_clickhouse::ClickHouseSession for Session {
async fn execute_query(&self, ctx: &mut CHContext, connection: &mut Connection) -> Result<()> {
let query = ctx.state.query.clone();
tracing::debug!("Receive query {}", query);
let start = Instant::now();
// simple logic for insert
if query.starts_with("INSERT") || query.starts_with("insert") {
// ctx.state.out
let sample_block = Block::new().column("abc", Vec::<u32>::new());
let (sender, rec) = mpsc::channel(4);
ctx.state.out = Some(sender);
connection.write_block(&sample_block).await?;
let sent_all_data = ctx.state.sent_all_data.clone();
tokio::spawn(async move {
let mut rows = 0;
let mut stream = ReceiverStream::new(rec);
while let Some(block) = stream.next().await {
rows += block.row_count();
println!(
"got insert block: {:?}, total_rows: {}",
block.row_count(),
rows
);
}
sent_all_data.notify_one();
});
return Ok(());
}
let mut clickhouse_stream = SimpleBlockStream {
idx: 0,
start: 10,
end: 24,
blocks: 10,
};
while let Some(block) = clickhouse_stream.next().await {
let block = block?;
connection.write_block(&block).await?;
if self.last_progress_send.elapsed() >= Duration::from_millis(10) {
let progress = self.get_progress();
connection
.write_progress(progress, ctx.client_revision)
.await?;
}
}
let duration = start.elapsed();
tracing::debug!(
"ClickHouseHandler executor cost:{:?}, statistics:{:?}",
duration,
"xxx",
);
Ok(())
}
fn metadata(&self) -> &ClickHouseMetadata {
&self.metadata
}
fn get_progress(&self) -> Progress {
Progress {
rows: 100,
bytes: 1000,
total_rows: 1000,
}
}
}
Submit issues for bug report or asking questions in discussion.
This project used to be sundy-li/clickhouse-srv.
Licensed under Apache License, Version 2.0.