use std::{
borrow::Cow,
cmp::min,
io::{self},
};
use saturating::Saturating as S;
use crate::{
binlog::{
consts::{BinlogVersion, EventType},
BinlogCtx, BinlogEvent, BinlogStruct,
},
io::ParseBuf,
misc::raw::{bytes::EofBytes, int::LeU32, RawBytes, RawInt},
proto::{MyDeserialize, MySerialize},
};
use super::BinlogEventHeader;
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct BeginLoadQueryEvent<'a> {
file_id: RawInt<LeU32>,
block_data: RawBytes<'a, EofBytes>,
}
impl<'a> BeginLoadQueryEvent<'a> {
pub fn new(file_id: u32) -> Self {
Self {
file_id: RawInt::new(file_id),
block_data: Default::default(),
}
}
pub fn with_file_id(mut self, file_id: u32) -> Self {
self.file_id.0 = file_id;
self
}
pub fn with_block_data(mut self, block_data: impl Into<Cow<'a, [u8]>>) -> Self {
self.block_data = RawBytes::new(block_data);
self
}
pub fn file_id(&self) -> u32 {
self.file_id.0
}
pub fn block_data(&'a self) -> &'a [u8] {
self.block_data.as_bytes()
}
pub fn into_owned(self) -> BeginLoadQueryEvent<'static> {
BeginLoadQueryEvent {
file_id: self.file_id,
block_data: self.block_data.into_owned(),
}
}
}
impl<'de> MyDeserialize<'de> for BeginLoadQueryEvent<'de> {
const SIZE: Option<usize> = None;
type Ctx = BinlogCtx<'de>;
fn deserialize(_ctx: Self::Ctx, buf: &mut ParseBuf<'de>) -> io::Result<Self> {
Ok(Self {
file_id: buf.parse(())?,
block_data: buf.parse(())?,
})
}
}
impl MySerialize for BeginLoadQueryEvent<'_> {
fn serialize(&self, buf: &mut Vec<u8>) {
self.file_id.serialize(&mut *buf);
self.block_data.serialize(&mut *buf);
}
}
impl<'a> BinlogStruct<'a> for BeginLoadQueryEvent<'a> {
fn len(&self, _version: BinlogVersion) -> usize {
let mut len = S(0);
len += S(4);
len += S(self.block_data.len());
min(len.0, u32::MAX as usize - BinlogEventHeader::LEN)
}
}
impl<'a> BinlogEvent<'a> for BeginLoadQueryEvent<'a> {
const EVENT_TYPE: EventType = EventType::BEGIN_LOAD_QUERY_EVENT;
}