mysql_binlog_connector_rust/event/
update_rows_event.rs

1use std::{collections::HashMap, io::Cursor};
2
3use serde::{Deserialize, Serialize};
4
5use crate::{binlog_error::BinlogError, ext::cursor_ext::CursorExt};
6
7use super::{event_header::EventHeader, row_event::RowEvent, table_map_event::TableMapEvent};
8
9#[derive(Debug, Deserialize, Serialize, Clone)]
10pub struct UpdateRowsEvent {
11    pub table_id: u64,
12    pub included_columns_before: Vec<bool>,
13    pub included_columns_after: Vec<bool>,
14    pub rows: Vec<(RowEvent, RowEvent)>,
15}
16
17impl UpdateRowsEvent {
18    pub fn parse(
19        cursor: &mut Cursor<&Vec<u8>>,
20        table_map_event_by_table_id: &mut HashMap<u64, TableMapEvent>,
21        row_event_version: u8,
22    ) -> Result<Self, BinlogError> {
23        let (table_id, column_count, included_columns_before) =
24            EventHeader::parse_rows_event_common_header(cursor, row_event_version)?;
25        let included_columns_after = cursor.read_bits(column_count, false)?;
26        let table_map_event = table_map_event_by_table_id.get(&table_id).unwrap();
27
28        let mut rows: Vec<(RowEvent, RowEvent)> = Vec::new();
29        while cursor.available() > 0 {
30            let before = RowEvent::parse(cursor, table_map_event, &included_columns_before)?;
31            let after = RowEvent::parse(cursor, table_map_event, &included_columns_after)?;
32            rows.push((before, after));
33        }
34
35        Ok(Self {
36            table_id,
37            included_columns_before,
38            included_columns_after,
39            rows,
40        })
41    }
42}