mysql_binlog_connector_rust/event/
format_description_event.rs1use crate::{binlog_error::BinlogError, event::event_type::EventType};
2use byteorder::{LittleEndian, ReadBytesExt};
3use serde::{Deserialize, Serialize};
4use std::io::{Cursor, Read, Seek, SeekFrom};
5
6use super::checksum_type::ChecksumType;
7
8#[derive(Debug, Deserialize, Serialize, Clone)]
9pub struct FormatDescriptionEvent {
10 pub binlog_version: u16,
11 pub server_version: String,
12 pub create_timestamp: u32,
13 pub header_length: u8,
14 pub checksum_type: ChecksumType,
15}
16
17impl FormatDescriptionEvent {
18 pub fn parse(cursor: &mut Cursor<&Vec<u8>>, data_length: usize) -> Result<Self, BinlogError> {
19 let binlog_version = cursor.read_u16::<LittleEndian>()?;
22
23 let mut server_version_buf = [0u8; 50];
25 cursor.read_exact(&mut server_version_buf)?;
26 let server_version = std::str::from_utf8(&server_version_buf)
27 .unwrap()
28 .to_string();
29
30 let create_timestamp = cursor.read_u32::<LittleEndian>()?;
32
33 let header_length = cursor.read_u8()?;
36
37 cursor.seek(SeekFrom::Current(EventType::FormatDescription as i64 - 1))?;
41 let payload_length = cursor.read_u8()? as usize;
42
43 let mut checksum_type = 0;
45 let checksum_block_length = data_length - payload_length;
46 if checksum_block_length > 0 {
47 let current_pos = 2 + 50 + 4 + 1 + EventType::FormatDescription as u8;
49 cursor.seek(SeekFrom::Current(
50 payload_length as i64 - current_pos as i64,
51 ))?;
52 checksum_type = cursor.read_u8()?;
54 }
55
56 Ok(Self {
57 binlog_version,
58 server_version,
59 create_timestamp,
60 header_length,
61 checksum_type: ChecksumType::from_code(checksum_type),
62 })
63 }
64}