mysql_binlog_connector_rust/event/
previous_gtids_event.rs1use super::gtid_event::GtidEvent;
2use crate::binlog_error::BinlogError;
3use byteorder::{LittleEndian, ReadBytesExt};
4use serde::{Deserialize, Serialize};
5use std::io::Cursor;
6
7#[derive(Debug, Deserialize, Serialize, Clone)]
8pub struct PreviousGtidsEvent {
9 pub gtid_set: String,
10}
11
12impl PreviousGtidsEvent {
13 pub fn parse(cursor: &mut Cursor<&Vec<u8>>) -> Result<Self, BinlogError> {
14 let uuid_count = cursor.read_u64::<LittleEndian>()?;
15 let mut gtids: Vec<String> = Vec::with_capacity(uuid_count as usize);
16
17 for _ in 0..uuid_count {
18 let uuid = GtidEvent::read_uuid(cursor)?;
19 let intervals = Self::read_interval(cursor)?;
20 gtids.push(format!("{}:{}", uuid, intervals));
21 }
22
23 Ok(Self {
24 gtid_set: gtids.join(","),
25 })
26 }
27
28 fn read_interval(cursor: &mut Cursor<&Vec<u8>>) -> Result<String, BinlogError> {
29 let interval_count = cursor.read_u64::<LittleEndian>()?;
30 let mut intervals = Vec::with_capacity(interval_count as usize);
31
32 for _ in 0..interval_count {
33 let start = cursor.read_u64::<LittleEndian>()?;
34 let end = cursor.read_u64::<LittleEndian>()?;
35 intervals.push(format!("{}-{}", start, end - 1));
38 }
39
40 Ok(intervals.join(":"))
41 }
42}