OpenSrv - ClickHouse

Bindings for emulating a ClickHouse server.

Usage

See the full example here

```rust struct Session { lastprogresssend: Instant, }

[asynctrait::asynctrait]

impl opensrvclickhouse::ClickHouseSession for Session { async fn executequery(&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 dbms_name(&self) -> &str {
    "ClickHouse-X"
}

fn dbms_version_major(&self) -> u64 {
    2021
}

fn dbms_version_minor(&self) -> u64 {
    5
}

// the MIN_SERVER_REVISION for suggestions is 54406
fn dbms_tcp_protocol_version(&self) -> u64 {
    54405
}

fn timezone(&self) -> &str {
    "UTC"
}

fn server_display_name(&self) -> &str {
    "ClickHouse-X"
}

fn dbms_version_patch(&self) -> u64 {
    0
}

fn get_progress(&self) -> Progress {
    Progress {
        rows: 100,
        bytes: 1000,
        total_rows: 1000,
    }
}

} ```

Getting help

Submit issues for bug report or asking questions in discussion.

Credits

This project used to be sundy-li/clickhouse-srv.

License

Licensed under Apache License, Version 2.0.