1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
//! MySQL binary log format constants.
//!
//! Defines magic bytes, field offsets, event type codes, flags, and checksum
//! algorithm identifiers for MySQL binary log files. All integer fields in
//! binlog events use **little-endian** byte order (unlike InnoDB pages which
//! use big-endian).
//!
//! Constants are derived from MySQL source `libbinlogevents/include/binlog_event.h`
//! and verified across MySQL 5.7, 8.0, 8.4, and 9.x.
// ---------------------------------------------------------------------------
// File header
// ---------------------------------------------------------------------------
/// Magic bytes at the start of every binlog file: `\xfebin`.
pub const BINLOG_MAGIC: = ;
/// Size of the magic byte prefix in bytes.
pub const BINLOG_MAGIC_SIZE: usize = 4;
// ---------------------------------------------------------------------------
// Common event header (19 bytes, all fields little-endian)
// ---------------------------------------------------------------------------
/// Offset of the timestamp field (u32, seconds since Unix epoch).
pub const EVENT_TIMESTAMP_OFFSET: usize = 0;
/// Offset of the event type code (u8).
pub const EVENT_TYPE_OFFSET: usize = 4;
/// Offset of the originating server ID (u32).
pub const EVENT_SERVER_ID_OFFSET: usize = 5;
/// Offset of the total event length (u32, includes header + payload + checksum).
pub const EVENT_LENGTH_OFFSET: usize = 9;
/// Offset of the next event position (u32, absolute file offset).
pub const EVENT_NEXT_POSITION_OFFSET: usize = 13;
/// Offset of the event flags (u16).
pub const EVENT_FLAGS_OFFSET: usize = 17;
/// Size of the common event header in bytes.
pub const COMMON_HEADER_SIZE: usize = 19;
// ---------------------------------------------------------------------------
// FORMAT_DESCRIPTION_EVENT payload offsets (relative to payload start)
// ---------------------------------------------------------------------------
/// Offset of the binlog format version (u16) within the FDE payload.
pub const FDE_BINLOG_VERSION_OFFSET: usize = 0;
/// Offset of the server version string (50 bytes, null-padded ASCII).
pub const FDE_SERVER_VERSION_OFFSET: usize = 2;
/// Length of the server version string field.
pub const FDE_SERVER_VERSION_LEN: usize = 50;
/// Offset of the creation timestamp (u32) within the FDE payload.
pub const FDE_CREATE_TIMESTAMP_OFFSET: usize = 52;
/// Offset of the common header length byte (u8, should be 19 for v4).
pub const FDE_HEADER_LENGTH_OFFSET: usize = 56;
/// Offset of the post-header-lengths array within the FDE payload.
pub const FDE_POST_HEADER_LENGTHS_OFFSET: usize = 57;
// ---------------------------------------------------------------------------
// ROTATE_EVENT payload offsets
// ---------------------------------------------------------------------------
/// Offset of the next binlog start position (u64) within ROTATE_EVENT payload.
pub const ROTATE_POSITION_OFFSET: usize = 0;
/// Offset of the next binlog filename within ROTATE_EVENT payload.
pub const ROTATE_FILENAME_OFFSET: usize = 8;
// ---------------------------------------------------------------------------
// Event type codes (u8) — from `enum Log_event_type` in binlog_event.h
// ---------------------------------------------------------------------------
/// Unknown or invalid event type.
pub const UNKNOWN_EVENT: u8 = 0;
/// Start event (binlog format v1-v3, replaced by FORMAT_DESCRIPTION_EVENT in v4).
pub const START_EVENT_V3: u8 = 1;
/// SQL query execution event.
pub const QUERY_EVENT: u8 = 2;
/// Server shutdown event.
pub const STOP_EVENT: u8 = 3;
/// Binlog file rotation event.
pub const ROTATE_EVENT: u8 = 4;
/// Integer session variable.
pub const INTVAR_EVENT: u8 = 5;
/// LOAD DATA INFILE event (deprecated).
pub const LOAD_EVENT: u8 = 6;
/// Slave event (internal replication, deprecated).
pub const SLAVE_EVENT: u8 = 7;
/// Create file for LOAD DATA (deprecated).
pub const CREATE_FILE_EVENT: u8 = 8;
/// Append block for LOAD DATA (deprecated).
pub const APPEND_BLOCK_EVENT: u8 = 9;
/// Execute LOAD DATA (deprecated).
pub const EXEC_LOAD_EVENT: u8 = 10;
/// Delete file for LOAD DATA (deprecated).
pub const DELETE_FILE_EVENT: u8 = 11;
/// New LOAD DATA INFILE event (deprecated).
pub const NEW_LOAD_EVENT: u8 = 12;
/// Random seed event for RAND().
pub const RAND_EVENT: u8 = 13;
/// User-defined variable event.
pub const USER_VAR_EVENT: u8 = 14;
/// Format description event (binlog v4 header, always first real event).
pub const FORMAT_DESCRIPTION_EVENT: u8 = 15;
/// XA transaction commit event (contains XID).
pub const XID_EVENT: u8 = 16;
/// Begin LOAD QUERY event.
pub const BEGIN_LOAD_QUERY_EVENT: u8 = 17;
/// Execute LOAD QUERY event.
pub const EXECUTE_LOAD_QUERY_EVENT: u8 = 18;
/// Table map event (row-based replication).
pub const TABLE_MAP_EVENT: u8 = 19;
/// Pre-GA write rows event.
pub const PRE_GA_WRITE_ROWS_EVENT: u8 = 20;
/// Pre-GA update rows event.
pub const PRE_GA_UPDATE_ROWS_EVENT: u8 = 21;
/// Pre-GA delete rows event.
pub const PRE_GA_DELETE_ROWS_EVENT: u8 = 22;
/// Write (INSERT) rows event, v1 format.
pub const WRITE_ROWS_EVENT_V1: u8 = 23;
/// Update rows event, v1 format.
pub const UPDATE_ROWS_EVENT_V1: u8 = 24;
/// Delete rows event, v1 format.
pub const DELETE_ROWS_EVENT_V1: u8 = 25;
/// Write (INSERT) rows event, v2 format (MySQL 5.6+).
pub const WRITE_ROWS_EVENT: u8 = 30;
/// Update rows event, v2 format (MySQL 5.6+).
pub const UPDATE_ROWS_EVENT: u8 = 31;
/// Incident event.
pub const INCIDENT_EVENT: u8 = 26;
/// Heartbeat log event.
pub const HEARTBEAT_LOG_EVENT: u8 = 27;
/// Ignorable log event.
pub const IGNORABLE_LOG_EVENT: u8 = 28;
/// Rows query log event.
pub const ROWS_QUERY_LOG_EVENT: u8 = 29;
/// Delete rows event, v2 format (MySQL 5.6+).
pub const DELETE_ROWS_EVENT: u8 = 32;
/// GTID event (MySQL 5.6+).
pub const GTID_LOG_EVENT: u8 = 33;
/// Anonymous GTID event (MySQL 5.6+).
pub const ANONYMOUS_GTID_LOG_EVENT: u8 = 34;
/// Previous GTIDs event (MySQL 5.6+).
pub const PREVIOUS_GTIDS_LOG_EVENT: u8 = 35;
/// Transaction context event (MySQL Group Replication).
pub const TRANSACTION_CONTEXT_EVENT: u8 = 36;
/// View change event (MySQL Group Replication).
pub const VIEW_CHANGE_EVENT: u8 = 37;
/// XA prepare log event.
pub const XA_PREPARE_LOG_EVENT: u8 = 38;
/// Partial update rows event (MySQL 8.0+).
pub const PARTIAL_UPDATE_ROWS_EVENT: u8 = 39;
/// Transaction payload event (MySQL 8.0.20+).
pub const TRANSACTION_PAYLOAD_EVENT: u8 = 40;
/// Heartbeat v2 event (MySQL 8.0.26+).
pub const HEARTBEAT_LOG_EVENT_V2: u8 = 41;
// ---------------------------------------------------------------------------
// Event flags
// ---------------------------------------------------------------------------
/// Flag indicating the binlog file is in use (not cleanly closed).
pub const LOG_EVENT_BINLOG_IN_USE_F: u16 = 0x0001;
// ---------------------------------------------------------------------------
// Checksum algorithm identifiers
// ---------------------------------------------------------------------------
/// No event checksums.
pub const BINLOG_CHECKSUM_ALG_OFF: u8 = 0;
/// CRC-32 event checksums (default since MySQL 5.6.6).
pub const BINLOG_CHECKSUM_ALG_CRC32: u8 = 1;
/// Size of the CRC-32 checksum appended to each event (when enabled).
pub const BINLOG_CHECKSUM_LEN: usize = 4;