mysql_binlog_connector_rust/event/
previous_gtids_event.rs

1use 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            // mysql "show binlog events in 'mysql-bin.000005'" returns:
36            // "58cf6502-63db-11ed-8079-0242ac110002:1-8" while we get interval_start = 1, interval_end = 9
37            intervals.push(format!("{}-{}", start, end - 1));
38        }
39
40        Ok(intervals.join(":"))
41    }
42}