use crate::client::Client;
use crate::constants;
use crate::error::Error;
use crate::messages::Message;
use crate::response::Response;
use crate::row::RowData;
use crate::statement::CachedStatement;
use crate::write_buffer::WriteBuffer;
pub struct FetchMessage<'statement> {
statement: &'statement CachedStatement,
last_row: Option<RowData>,
}
impl FetchMessage<'_> {
pub fn new<'statement>(
statement: &'statement CachedStatement,
last_row: Option<RowData>,
) -> FetchMessage<'statement> {
FetchMessage {
statement,
last_row,
}
}
}
impl Message for FetchMessage<'_> {
fn deserialize_row_data(
&mut self,
client: &Client,
resp: &mut Response,
) -> Result<(), Error> {
resp.deserialize_row_data(client, self.statement, true)
}
fn post_deserialize(
&mut self,
_client: &mut Client,
resp: &mut Response,
) -> Result<(), Error> {
resp.check_for_end_of_fetch(self.statement)
}
fn pre_deserialize(&mut self, _client: &mut Client, resp: &mut Response) {
resp.set_prev_fetch_last_row(self.last_row.take());
resp.set_num_columns(self.statement.out_metadata().len());
}
fn serialize(&self, client: &Client, buf: &mut WriteBuffer) {
buf.write_function_header(client, constants::TTC_RPC_FETCH);
buf.write_ub2(self.statement.cursor_id());
buf.write_ub4(self.statement.options().fetch_array_size());
}
}