use futures::{AsyncWrite, AsyncWriteExt};
use crate::{
error::Error,
file::{CompressedBlock, Compression},
schema::{Record, Schema},
write::encode::zigzag_encode,
write::file::{write_schema, AVRO_MAGIC, SYNC_NUMBER},
};
pub async fn write_metadata<W>(
writer: &mut W,
record: Record,
compression: Option<Compression>,
) -> Result<(), Error>
where
W: AsyncWrite + Unpin,
{
writer.write_all(&AVRO_MAGIC).await?;
let schema = Schema::Record(record);
let mut scratch = vec![];
write_schema(&mut scratch, &schema, compression)?;
writer.write_all(&scratch).await?;
writer.write_all(&SYNC_NUMBER).await?;
Ok(())
}
pub async fn write_block<W>(writer: &mut W, block: &CompressedBlock) -> Result<(), Error>
where
W: AsyncWrite + Unpin,
{
let mut scratch = Vec::with_capacity(10);
zigzag_encode(block.number_of_rows as i64, &mut scratch)?;
writer.write_all(&scratch).await?;
scratch.clear();
zigzag_encode(block.data.len() as i64, &mut scratch)?;
writer.write_all(&scratch).await?;
writer.write_all(&block.data).await?;
writer.write_all(&SYNC_NUMBER).await?;
Ok(())
}