use tokio::io::{AsyncReadExt, AsyncWriteExt};
use crate::io::{ClickHouseBytesRead, ClickHouseBytesWrite, ClickHouseRead, ClickHouseWrite};
use crate::{Error, Result};
#[derive(Debug, Clone, Copy)]
pub struct BlockInfo {
pub is_overflows: bool,
pub bucket_num: i32,
}
impl Default for BlockInfo {
fn default() -> Self { BlockInfo { is_overflows: false, bucket_num: -1 } }
}
impl BlockInfo {
pub(crate) async fn read_async<R: ClickHouseRead>(reader: &mut R) -> Result<Self> {
let mut new = Self::default();
loop {
let field_num = reader.read_var_uint().await?;
match field_num {
0 => break,
1 => {
new.is_overflows = reader.read_u8().await? != 0;
}
2 => {
new.bucket_num = reader.read_i32_le().await?;
}
field_num => {
return Err(Error::Protocol(format!(
"unknown block info field number: {field_num}"
)));
}
}
}
Ok(new)
}
pub(crate) async fn write_async<W: ClickHouseWrite>(&self, writer: &mut W) -> Result<()> {
writer.write_var_uint(1).await?; writer.write_u8(if self.is_overflows { 1 } else { 2 }).await?; writer.write_var_uint(2).await?; writer.write_i32_le(self.bucket_num).await?; writer.write_var_uint(0).await?; Ok(())
}
#[allow(dead_code)] pub(crate) fn read<R: ClickHouseBytesRead>(reader: &mut R) -> Result<Self> {
let mut new = Self::default();
loop {
let field_num = reader.try_get_var_uint()?;
match field_num {
0 => break,
1 => {
new.is_overflows = reader.try_get_u8()? != 0;
}
2 => {
new.bucket_num = reader.try_get_i32_le()?;
}
field_num => {
return Err(Error::Protocol(format!(
"unknown block info field number: {field_num}"
)));
}
}
}
Ok(new)
}
pub(crate) fn write<W: ClickHouseBytesWrite>(self, writer: &mut W) -> Result<()> {
writer.put_var_uint(1)?; writer.put_u8(if self.is_overflows { 1 } else { 2 }); writer.put_var_uint(2)?; writer.put_i32_le(self.bucket_num); writer.put_var_uint(0)?; Ok(())
}
}