use std::convert::{TryFrom, TryInto};
#[repr(u16)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum BinlogVersion {
Version1 = 1,
Version2,
Version3,
Version4,
}
impl From<BinlogVersion> for u16 {
fn from(x: BinlogVersion) -> Self {
x as u16
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown binlog version {0}")]
#[repr(transparent)]
pub struct UnknownBinlogVersion(pub u16);
impl From<UnknownBinlogVersion> for u16 {
fn from(x: UnknownBinlogVersion) -> Self {
x.0
}
}
impl TryFrom<u16> for BinlogVersion {
type Error = UnknownBinlogVersion;
fn try_from(value: u16) -> Result<Self, Self::Error> {
match value {
1 => Ok(Self::Version1),
2 => Ok(Self::Version2),
3 => Ok(Self::Version3),
4 => Ok(Self::Version4),
x => Err(UnknownBinlogVersion(x)),
}
}
}
#[allow(non_camel_case_types)]
#[repr(u8)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum EventType {
UNKNOWN_EVENT = 0x00,
START_EVENT_V3 = 0x01,
QUERY_EVENT = 0x02,
STOP_EVENT = 0x03,
ROTATE_EVENT = 0x04,
INTVAR_EVENT = 0x05,
LOAD_EVENT = 0x06,
SLAVE_EVENT = 0x07,
CREATE_FILE_EVENT = 0x08,
APPEND_BLOCK_EVENT = 0x09,
EXEC_LOAD_EVENT = 0x0a,
DELETE_FILE_EVENT = 0x0b,
NEW_LOAD_EVENT = 0x0c,
RAND_EVENT = 0x0d,
USER_VAR_EVENT = 0x0e,
FORMAT_DESCRIPTION_EVENT = 0x0f,
XID_EVENT = 0x10,
BEGIN_LOAD_QUERY_EVENT = 0x11,
EXECUTE_LOAD_QUERY_EVENT = 0x12,
TABLE_MAP_EVENT = 0x13,
PRE_GA_WRITE_ROWS_EVENT = 0x14,
PRE_GA_UPDATE_ROWS_EVENT = 0x15,
PRE_GA_DELETE_ROWS_EVENT = 0x16,
WRITE_ROWS_EVENT_V1 = 0x17,
UPDATE_ROWS_EVENT_V1 = 0x18,
DELETE_ROWS_EVENT_V1 = 0x19,
INCIDENT_EVENT = 0x1a,
HEARTBEAT_EVENT = 0x1b,
IGNORABLE_EVENT = 0x1c,
ROWS_QUERY_EVENT = 0x1d,
WRITE_ROWS_EVENT = 0x1e,
UPDATE_ROWS_EVENT = 0x1f,
DELETE_ROWS_EVENT = 0x20,
GTID_EVENT = 0x21,
ANONYMOUS_GTID_EVENT = 0x22,
PREVIOUS_GTIDS_EVENT = 0x23,
TRANSACTION_CONTEXT_EVENT = 0x24,
VIEW_CHANGE_EVENT = 0x25,
XA_PREPARE_LOG_EVENT = 0x26,
PARTIAL_UPDATE_ROWS_EVENT = 0x27,
TRANSACTION_PAYLOAD_EVENT = 0x28,
GTID_TAGGED_LOG_EVENT = 0x2a,
ENUM_END_EVENT,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown event type {0}")]
#[repr(transparent)]
pub struct UnknownEventType(pub u8);
impl From<UnknownEventType> for u8 {
fn from(x: UnknownEventType) -> Self {
x.0
}
}
impl TryFrom<u8> for EventType {
type Error = UnknownEventType;
fn try_from(byte: u8) -> Result<Self, UnknownEventType> {
match byte {
0x00 => Ok(Self::UNKNOWN_EVENT),
0x01 => Ok(Self::START_EVENT_V3),
0x02 => Ok(Self::QUERY_EVENT),
0x03 => Ok(Self::STOP_EVENT),
0x04 => Ok(Self::ROTATE_EVENT),
0x05 => Ok(Self::INTVAR_EVENT),
0x06 => Ok(Self::LOAD_EVENT),
0x07 => Ok(Self::SLAVE_EVENT),
0x08 => Ok(Self::CREATE_FILE_EVENT),
0x09 => Ok(Self::APPEND_BLOCK_EVENT),
0x0a => Ok(Self::EXEC_LOAD_EVENT),
0x0b => Ok(Self::DELETE_FILE_EVENT),
0x0c => Ok(Self::NEW_LOAD_EVENT),
0x0d => Ok(Self::RAND_EVENT),
0x0e => Ok(Self::USER_VAR_EVENT),
0x0f => Ok(Self::FORMAT_DESCRIPTION_EVENT),
0x10 => Ok(Self::XID_EVENT),
0x11 => Ok(Self::BEGIN_LOAD_QUERY_EVENT),
0x12 => Ok(Self::EXECUTE_LOAD_QUERY_EVENT),
0x13 => Ok(Self::TABLE_MAP_EVENT),
0x14 => Ok(Self::PRE_GA_WRITE_ROWS_EVENT),
0x15 => Ok(Self::PRE_GA_UPDATE_ROWS_EVENT),
0x16 => Ok(Self::PRE_GA_DELETE_ROWS_EVENT),
0x17 => Ok(Self::WRITE_ROWS_EVENT_V1),
0x18 => Ok(Self::UPDATE_ROWS_EVENT_V1),
0x19 => Ok(Self::DELETE_ROWS_EVENT_V1),
0x1a => Ok(Self::INCIDENT_EVENT),
0x1b => Ok(Self::HEARTBEAT_EVENT),
0x1c => Ok(Self::IGNORABLE_EVENT),
0x1d => Ok(Self::ROWS_QUERY_EVENT),
0x1e => Ok(Self::WRITE_ROWS_EVENT),
0x1f => Ok(Self::UPDATE_ROWS_EVENT),
0x20 => Ok(Self::DELETE_ROWS_EVENT),
0x21 => Ok(Self::GTID_EVENT),
0x22 => Ok(Self::ANONYMOUS_GTID_EVENT),
0x23 => Ok(Self::PREVIOUS_GTIDS_EVENT),
0x24 => Ok(Self::TRANSACTION_CONTEXT_EVENT),
0x25 => Ok(Self::VIEW_CHANGE_EVENT),
0x26 => Ok(Self::XA_PREPARE_LOG_EVENT),
0x27 => Ok(Self::PARTIAL_UPDATE_ROWS_EVENT),
0x28 => Ok(Self::TRANSACTION_PAYLOAD_EVENT),
0x2a => Ok(Self::GTID_TAGGED_LOG_EVENT),
x => Err(UnknownEventType(x)),
}
}
}
my_bitflags! {
EventFlags,
#[error("Unknown flags in the raw value of EventFlags (raw={0:b})")]
UnknownEventFlags,
u16,
#[derive(PartialEq, Eq, Hash, Debug, Clone, Copy)]
pub struct EventFlags: u16 {
const LOG_EVENT_BINLOG_IN_USE_F = 0x0001;
const LOG_EVENT_FORCED_ROTATE_F = 0x0002;
const LOG_EVENT_THREAD_SPECIFIC_F = 0x0004;
const LOG_EVENT_SUPPRESS_USE_F = 0x0008;
const LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F = 0x0010;
const LOG_EVENT_ARTIFICIAL_F = 0x0020;
const LOG_EVENT_RELAY_LOG_F = 0x0040;
const LOG_EVENT_IGNORABLE_F = 0x0080;
const LOG_EVENT_NO_FILTER_F = 0x0100;
const LOG_EVENT_MTS_ISOLATE_F = 0x0200;
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
#[allow(non_camel_case_types)]
#[repr(u8)]
pub enum BinlogChecksumAlg {
BINLOG_CHECKSUM_ALG_OFF = 0,
BINLOG_CHECKSUM_ALG_CRC32 = 1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown checksum algorithm {0}")]
#[repr(transparent)]
pub struct UnknownChecksumAlg(pub u8);
impl From<UnknownChecksumAlg> for u8 {
fn from(x: UnknownChecksumAlg) -> Self {
x.0
}
}
impl TryFrom<u8> for BinlogChecksumAlg {
type Error = UnknownChecksumAlg;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::BINLOG_CHECKSUM_ALG_OFF),
1 => Ok(Self::BINLOG_CHECKSUM_ALG_CRC32),
x => Err(UnknownChecksumAlg(x)),
}
}
}
#[repr(u8)]
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum StatusVarKey {
Flags2 = 0,
SqlMode,
Catalog,
AutoIncrement,
Charset,
TimeZone,
CatalogNz,
LcTimeNames,
CharsetDatabase,
TableMapForUpdate,
MasterDataWritten,
Invoker,
UpdatedDbNames,
Microseconds,
CommitTs,
CommitTs2,
ExplicitDefaultsForTimestamp,
DdlLoggedWithXid,
DefaultCollationForUtf8mb4,
SqlRequirePrimaryKey,
DefaultTableEncryption,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown status var key {0}")]
#[repr(transparent)]
pub struct UnknownStatusVarKey(pub u8);
impl TryFrom<u8> for StatusVarKey {
type Error = UnknownStatusVarKey;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(StatusVarKey::Flags2),
1 => Ok(StatusVarKey::SqlMode),
2 => Ok(StatusVarKey::Catalog),
3 => Ok(StatusVarKey::AutoIncrement),
4 => Ok(StatusVarKey::Charset),
5 => Ok(StatusVarKey::TimeZone),
6 => Ok(StatusVarKey::CatalogNz),
7 => Ok(StatusVarKey::LcTimeNames),
8 => Ok(StatusVarKey::CharsetDatabase),
9 => Ok(StatusVarKey::TableMapForUpdate),
10 => Ok(StatusVarKey::MasterDataWritten),
11 => Ok(StatusVarKey::Invoker),
12 => Ok(StatusVarKey::UpdatedDbNames),
13 => Ok(StatusVarKey::Microseconds),
14 => Ok(StatusVarKey::CommitTs),
15 => Ok(StatusVarKey::CommitTs2),
16 => Ok(StatusVarKey::ExplicitDefaultsForTimestamp),
17 => Ok(StatusVarKey::DdlLoggedWithXid),
18 => Ok(StatusVarKey::DefaultCollationForUtf8mb4),
19 => Ok(StatusVarKey::SqlRequirePrimaryKey),
20 => Ok(StatusVarKey::DefaultTableEncryption),
x => Err(UnknownStatusVarKey(x)),
}
}
}
my_bitflags! {
SemiSyncFlags,
#[error("Unknown flags in the raw value of SemiSyncFlags (raw={0:b})")]
UnknownSemiSyncFlags,
u8,
#[derive(PartialEq, Eq, Hash, Debug, Clone, Copy)]
pub struct SemiSyncFlags: u8 {
const SEMI_SYNC_ACK_REQ = 0x01;
}
}
#[repr(u8)]
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum LoadDuplicateHandling {
LOAD_DUP_ERROR = 0,
LOAD_DUP_IGNORE,
LOAD_DUP_REPLACE,
}
impl From<LoadDuplicateHandling> for u8 {
fn from(x: LoadDuplicateHandling) -> Self {
x as u8
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown duplicate handling variant {0}")]
#[repr(transparent)]
pub struct UnknownDuplicateHandling(pub u8);
impl From<UnknownDuplicateHandling> for u8 {
fn from(x: UnknownDuplicateHandling) -> Self {
x.0
}
}
impl TryFrom<u8> for LoadDuplicateHandling {
type Error = UnknownDuplicateHandling;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::LOAD_DUP_ERROR),
1 => Ok(Self::LOAD_DUP_IGNORE),
2 => Ok(Self::LOAD_DUP_REPLACE),
x => Err(UnknownDuplicateHandling(x)),
}
}
}
#[repr(u8)]
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum OptionalMetadataFieldType {
SIGNEDNESS = 1,
DEFAULT_CHARSET,
COLUMN_CHARSET,
COLUMN_NAME,
SET_STR_VALUE,
ENUM_STR_VALUE,
GEOMETRY_TYPE,
SIMPLE_PRIMARY_KEY,
PRIMARY_KEY_WITH_PREFIX,
ENUM_AND_SET_DEFAULT_CHARSET,
ENUM_AND_SET_COLUMN_CHARSET,
COLUMN_VISIBILITY,
VECTOR_DIMENSIONALITY,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
#[error("Unknown optional metadata field type {0}")]
pub struct UnknownOptionalMetadataFieldType(pub u8);
impl From<UnknownOptionalMetadataFieldType> for u8 {
fn from(x: UnknownOptionalMetadataFieldType) -> Self {
x.0
}
}
impl TryFrom<u8> for OptionalMetadataFieldType {
type Error = UnknownOptionalMetadataFieldType;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
1 => Ok(Self::SIGNEDNESS),
2 => Ok(Self::DEFAULT_CHARSET),
3 => Ok(Self::COLUMN_CHARSET),
4 => Ok(Self::COLUMN_NAME),
5 => Ok(Self::SET_STR_VALUE),
6 => Ok(Self::ENUM_STR_VALUE),
7 => Ok(Self::GEOMETRY_TYPE),
8 => Ok(Self::SIMPLE_PRIMARY_KEY),
9 => Ok(Self::PRIMARY_KEY_WITH_PREFIX),
10 => Ok(Self::ENUM_AND_SET_DEFAULT_CHARSET),
11 => Ok(Self::ENUM_AND_SET_COLUMN_CHARSET),
12 => Ok(Self::COLUMN_VISIBILITY),
13 => Ok(Self::VECTOR_DIMENSIONALITY),
x => Err(UnknownOptionalMetadataFieldType(x)),
}
}
}
#[repr(u16)]
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum IncidentType {
INCIDENT_NONE = 0,
INCIDENT_LOST_EVENTS = 1,
}
impl From<IncidentType> for u16 {
fn from(x: IncidentType) -> Self {
x as u16
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown item incident type {0}")]
#[repr(transparent)]
pub struct UnknownIncidentType(pub u16);
impl From<UnknownIncidentType> for u16 {
fn from(x: UnknownIncidentType) -> Self {
x.0
}
}
impl TryFrom<u16> for IncidentType {
type Error = UnknownIncidentType;
fn try_from(value: u16) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::INCIDENT_NONE),
1 => Ok(Self::INCIDENT_LOST_EVENTS),
x => Err(UnknownIncidentType(x)),
}
}
}
#[repr(u8)]
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum IntvarEventType {
INVALID_INT_EVENT,
LAST_INSERT_ID_EVENT,
INSERT_ID_EVENT,
}
impl From<IntvarEventType> for u8 {
fn from(x: IntvarEventType) -> Self {
x as u8
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown intvar event type {0}")]
#[repr(transparent)]
pub struct UnknownIntvarEventType(pub u8);
impl From<UnknownIntvarEventType> for u8 {
fn from(x: UnknownIntvarEventType) -> Self {
x.0
}
}
impl TryFrom<u8> for IntvarEventType {
type Error = UnknownIntvarEventType;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::INVALID_INT_EVENT),
1 => Ok(Self::LAST_INSERT_ID_EVENT),
2 => Ok(Self::INSERT_ID_EVENT),
x => Err(UnknownIntvarEventType(x)),
}
}
}
my_bitflags! {
GtidFlags,
#[error("Unknown flags in the raw value of GtidFlags (raw={0:b})")]
UnknownGtidFlags,
u8,
#[derive(PartialEq, Eq, Hash, Debug, Clone, Copy)]
pub struct GtidFlags: u8 {
const MAY_HAVE_SBR = 0x01;
}
}
#[repr(transparent)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct Gno(u64);
impl Gno {
pub const MIN_GNO: u64 = 1;
pub const MAX_GNO: u64 = i64::MAX as u64;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Group number {0} is out of range [{min}, {max}]", min = Gno::MIN_GNO, max = Gno::MAX_GNO)]
#[repr(transparent)]
pub struct InvalidGno(pub u64);
impl From<InvalidGno> for u64 {
fn from(x: InvalidGno) -> Self {
x.0
}
}
impl TryFrom<u64> for Gno {
type Error = InvalidGno;
fn try_from(value: u64) -> Result<Self, Self::Error> {
if value == 0 || (Self::MIN_GNO..Self::MAX_GNO).contains(&value) {
Ok(Self(value))
} else {
Err(InvalidGno(value))
}
}
}
my_bitflags! {
RowsEventFlags,
#[error("Unknown flags in the raw value of RowsEventFlags (raw={0:b})")]
UnknownRowsEventFlags,
u16,
#[derive(PartialEq, Eq, Hash, Debug, Clone, Copy)]
pub struct RowsEventFlags: u16 {
const STMT_END = 0x0001;
const NO_FOREIGN_KEY_CHECKS = 0x0002;
const RELAXED_UNIQUE_CHECKS = 0x0004;
const COMPLETE_ROWS = 0x0008;
}
}
my_bitflags! {
UserVarFlags,
#[error("Unknown flags in the raw value of UserVarFlags (raw={0:b})")]
UnknownUserVarFlags,
u8,
#[derive(PartialEq, Eq, Hash, Debug, Clone, Copy)]
pub struct UserVarFlags: u8 {
const UNSIGNED = 0x01;
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum TransactionPayloadFields {
OTW_PAYLOAD_HEADER_END_MARK = 0,
OTW_PAYLOAD_SIZE_FIELD = 1,
OTW_PAYLOAD_COMPRESSION_TYPE_FIELD = 2,
OTW_PAYLOAD_UNCOMPRESSED_SIZE_FIELD = 3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown TransactionPayloadFields operation {}", _0)]
#[repr(transparent)]
pub struct UnknownTransactionPayloadFields(pub u8);
impl TryFrom<u8> for TransactionPayloadFields {
type Error = UnknownTransactionPayloadFields;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::OTW_PAYLOAD_HEADER_END_MARK),
1 => Ok(Self::OTW_PAYLOAD_SIZE_FIELD),
2 => Ok(Self::OTW_PAYLOAD_COMPRESSION_TYPE_FIELD),
3 => Ok(Self::OTW_PAYLOAD_UNCOMPRESSED_SIZE_FIELD),
x => Err(UnknownTransactionPayloadFields(x)),
}
}
}
impl From<TransactionPayloadFields> for u8 {
fn from(x: TransactionPayloadFields) -> Self {
x as u8
}
}
impl From<TransactionPayloadFields> for u64 {
fn from(x: TransactionPayloadFields) -> Self {
x as u64
}
}
impl TryFrom<u64> for TransactionPayloadFields {
type Error = UnknownTransactionPayloadFields;
fn try_from(value: u64) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::OTW_PAYLOAD_HEADER_END_MARK),
1 => Ok(Self::OTW_PAYLOAD_SIZE_FIELD),
2 => Ok(Self::OTW_PAYLOAD_COMPRESSION_TYPE_FIELD),
3 => Ok(Self::OTW_PAYLOAD_UNCOMPRESSED_SIZE_FIELD),
x => Err(UnknownTransactionPayloadFields(x.try_into().unwrap())),
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum TransactionPayloadCompressionType {
ZSTD = 0,
NONE = 255,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, thiserror::Error)]
#[error("Unknown TransactionPayloadCompressionType {}", _0)]
#[repr(transparent)]
pub struct UnknownTransactionPayloadCompressionType(pub u8);
impl TryFrom<u8> for TransactionPayloadCompressionType {
type Error = UnknownTransactionPayloadCompressionType;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::ZSTD),
255 => Ok(Self::NONE),
x => Err(UnknownTransactionPayloadCompressionType(x)),
}
}
}
impl TryFrom<u64> for TransactionPayloadCompressionType {
type Error = UnknownTransactionPayloadCompressionType;
fn try_from(value: u64) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::ZSTD),
255 => Ok(Self::NONE),
x => Err(UnknownTransactionPayloadCompressionType(
x.try_into().unwrap(),
)),
}
}
}