mysql_binlog_connector_rust/event/
update_rows_event.rs1use 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}