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