use bytes::BytesMut;
use tokio_util::codec::Encoder;
use crate::pgwire::protocol::{
backend::RowDescription, ConnectionCodec, FormatCode, ProtocolError,
};
use super::data_row_writer::DataRowWriter;
pub struct DataRowBatch {
pub(crate) format_code: FormatCode,
pub(crate) num_cols: usize,
pub(crate) num_rows: usize,
pub(crate) data: BytesMut,
pub(crate) row: BytesMut,
}
impl DataRowBatch {
pub fn new(format_code: FormatCode, num_cols: usize) -> Self {
Self {
format_code,
num_cols,
num_rows: 0,
data: BytesMut::new(),
row: BytesMut::new(),
}
}
pub fn from_row_desc(desc: &RowDescription) -> Self {
Self::new(desc.format_code, desc.fields.len())
}
pub fn create_row(&mut self) -> DataRowWriter {
self.num_rows += 1;
DataRowWriter::new(self)
}
pub fn num_rows(&self) -> usize {
self.num_rows
}
}
impl Encoder<DataRowBatch> for ConnectionCodec {
type Error = ProtocolError;
fn encode(&mut self, item: DataRowBatch, dst: &mut BytesMut) -> Result<(), Self::Error> {
dst.extend(item.data);
Ok(())
}
}