1pub const UTF8MB4_GENERAL_CI: u8 = 45;
3
4pub const MAX_ALLOWED_PACKET: u32 = 0x0100_0000;
6
7#[repr(u8)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum CommandByte {
10 Quit = 0x01,
11 InitDb = 0x02,
12 Query = 0x03,
13 FieldList = 0x04,
14 CreateDb = 0x05,
15 DropDb = 0x06,
16 Refresh = 0x07,
17 Shutdown = 0x08,
18 Statistics = 0x09,
19 ProcessInfo = 0x0a,
20 Connect = 0x0b,
21 ProcessKill = 0x0c,
22 Debug = 0x0d,
23 Ping = 0x0e,
24 Time = 0x0f,
25 DelayedInsert = 0x10,
26 ChangeUser = 0x11,
27 BinlogDump = 0x12,
28 TableDump = 0x13,
29 ConnectOut = 0x14,
30 RegisterSlave = 0x15,
31 StmtPrepare = 0x16,
32 StmtExecute = 0x17,
33 StmtSendLongData = 0x18,
34 StmtClose = 0x19,
35 StmtReset = 0x1a,
36 SetOption = 0x1b,
37 StmtFetch = 0x1c,
38 Daemon = 0x1d,
39 BinlogDumpGtid = 0x1e,
40 ResetConnection = 0x1f,
41 StmtBulkExecute = 0xfa,
43}
44
45bitflags::bitflags! {
46 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
47 pub struct CapabilityFlags: u32 {
48 const CLIENT_LONG_PASSWORD = 0x00000001;
50 const CLIENT_FOUND_ROWS = 0x00000002;
52 const CLIENT_LONG_FLAG = 0x00000004;
54 const CLIENT_CONNECT_WITH_DB = 0x00000008;
56 const CLIENT_NO_SCHEMA = 0x00000010;
58 const CLIENT_COMPRESS = 0x00000020;
60 const CLIENT_ODBC = 0x00000040;
62 const CLIENT_LOCAL_FILES = 0x00000080;
64 const CLIENT_IGNORE_SPACE = 0x00000100;
66 const CLIENT_PROTOCOL_41 = 0x00000200;
68 const CLIENT_INTERACTIVE = 0x00000400;
70 const CLIENT_SSL = 0x00000800;
72 const CLIENT_IGNORE_SIGPIPE = 0x00001000;
74 const CLIENT_TRANSACTIONS = 0x00002000;
76 const CLIENT_RESERVED = 0x00004000;
78 const CLIENT_SECURE_CONNECTION = 0x00008000;
80 const CLIENT_MULTI_STATEMENTS = 0x00010000;
82 const CLIENT_MULTI_RESULTS = 0x00020000;
84 const CLIENT_PS_MULTI_RESULTS = 0x00040000;
86 const CLIENT_PLUGIN_AUTH = 0x00080000;
88 const CLIENT_CONNECT_ATTRS = 0x00100000;
90 const CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA = 0x00200000;
92 const CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS = 0x00400000;
94 const CLIENT_SESSION_TRACK = 0x00800000;
96 const CLIENT_DEPRECATE_EOF = 0x01000000;
98 const CLIENT_OPTIONAL_RESULTSET_METADATA = 0x02000000;
100 const CLIENT_ZSTD_COMPRESSION_ALGORITHM = 0x04000000;
102 const CLIENT_QUERY_ATTRIBUTES = 0x08000000;
104 const CLIENT_MULTI_FACTOR_AUTHENTICATION = 0x10000000;
106 const CLIENT_CAPABILITY_EXTENSION = 0x20000000;
108 const CLIENT_SSL_VERIFY_SERVER_CERT = 0x40000000;
110 const CLIENT_REMEMBER_OPTIONS = 0x80000000;
112 }
113}
114
115impl CapabilityFlags {
116 #[inline]
120 pub fn is_mysql(&self) -> bool {
121 self.contains(CapabilityFlags::CLIENT_LONG_PASSWORD)
122 }
123 #[inline]
124 pub fn is_mariadb(&self) -> bool {
125 !self.is_mysql()
126 }
127}
128
129pub const CAPABILITIES_ALWAYS_ENABLED: CapabilityFlags = CapabilityFlags::CLIENT_LONG_PASSWORD
131 .union(CapabilityFlags::CLIENT_LONG_FLAG)
132 .union(CapabilityFlags::CLIENT_PROTOCOL_41)
133 .union(CapabilityFlags::CLIENT_TRANSACTIONS)
134 .union(CapabilityFlags::CLIENT_MULTI_STATEMENTS)
135 .union(CapabilityFlags::CLIENT_MULTI_RESULTS)
136 .union(CapabilityFlags::CLIENT_PS_MULTI_RESULTS) .union(CapabilityFlags::CLIENT_SECURE_CONNECTION) .union(CapabilityFlags::CLIENT_PLUGIN_AUTH)
139 .union(CapabilityFlags::CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA)
140 .union(CapabilityFlags::CLIENT_DEPRECATE_EOF);
141
142pub const CAPABILITIES_CONFIGURABLE: CapabilityFlags = CapabilityFlags::CLIENT_FOUND_ROWS
144 .union(CapabilityFlags::CLIENT_COMPRESS)
145 .union(CapabilityFlags::CLIENT_LOCAL_FILES)
146 .union(CapabilityFlags::CLIENT_IGNORE_SPACE)
147 .union(CapabilityFlags::CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS);
148
149pub const CAPABILITIES_ALWAYS_DISABLED: CapabilityFlags =
151 CapabilityFlags::CLIENT_CONNECT_WITH_DB .union(CapabilityFlags::CLIENT_OPTIONAL_RESULTSET_METADATA) .union(CapabilityFlags::CLIENT_NO_SCHEMA)
154 .union(CapabilityFlags::CLIENT_ODBC)
155 .union(CapabilityFlags::CLIENT_INTERACTIVE)
156 .union(CapabilityFlags::CLIENT_IGNORE_SIGPIPE)
157 .union(CapabilityFlags::CLIENT_RESERVED)
158 .union(CapabilityFlags::CLIENT_QUERY_ATTRIBUTES)
159 .union(CapabilityFlags::CLIENT_ZSTD_COMPRESSION_ALGORITHM)
160 .union(CapabilityFlags::CLIENT_MULTI_FACTOR_AUTHENTICATION)
161 .union(CapabilityFlags::CLIENT_CAPABILITY_EXTENSION)
162 .union(CapabilityFlags::CLIENT_SSL) .union(CapabilityFlags::CLIENT_SSL_VERIFY_SERVER_CERT)
164 .union(CapabilityFlags::CLIENT_REMEMBER_OPTIONS)
165 .union(CapabilityFlags::CLIENT_CONNECT_ATTRS) .union(CapabilityFlags::CLIENT_SESSION_TRACK); bitflags::bitflags! {
169 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
171 pub struct MariadbCapabilityFlags: u32 {
172 const MARIADB_CLIENT_PROGRESS = 1 << 0;
174 const MARIADB_CLIENT_COM_MULTI = 1 << 1; const MARIADB_CLIENT_STMT_BULK_OPERATIONS = 1 << 2;
176 const MARIADB_CLIENT_EXTENDED_METADATA = 1 << 3; const MARIADB_CLIENT_CACHE_METADATA = 1 << 4;
178 const MARIADB_CLIENT_BULK_UNIT_RESULTS = 1 << 5; }
180}
181
182pub const MARIADB_CAPABILITIES_ENABLED: MariadbCapabilityFlags =
183 MariadbCapabilityFlags::MARIADB_CLIENT_STMT_BULK_OPERATIONS
184 .union(MariadbCapabilityFlags::MARIADB_CLIENT_CACHE_METADATA);
185
186bitflags::bitflags! {
187 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
190 pub struct ServerStatusFlags: u16 {
191 const SERVER_STATUS_IN_TRANS = 0x0001;
193 const SERVER_STATUS_AUTOCOMMIT = 0x0002;
195 const SERVER_MORE_RESULTS_EXISTS = 0x0008;
197 const SERVER_STATUS_NO_GOOD_INDEX_USED = 0x0010;
199 const SERVER_STATUS_NO_INDEX_USED = 0x0020;
201 const SERVER_STATUS_CURSOR_EXISTS = 0x0040;
203 const SERVER_STATUS_LAST_ROW_SENT = 0x0080;
205 const SERVER_STATUS_DB_DROPPED = 0x0100;
207 const SERVER_STATUS_NO_BACKSLASH_ESCAPES = 0x0200;
209 const SERVER_STATUS_METADATA_CHANGED = 0x0400;
211 const SERVER_QUERY_WAS_SLOW = 0x0800;
213 const SERVER_PS_OUT_PARAMS = 0x1000;
215 const SERVER_STATUS_IN_TRANS_READONLY = 0x2000;
217 const SERVER_SESSION_STATE_CHANGED = 0x4000;
219 }
220}
221
222bitflags::bitflags! {
223 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
225 pub struct ColumnFlags: u16 {
226 const NOT_NULL_FLAG = 0x0001;
228 const PRI_KEY_FLAG = 0x0002;
230 const UNIQUE_KEY_FLAG = 0x0004;
232 const MULTIPLE_KEY_FLAG = 0x0008;
234 const BLOB_FLAG = 0x0010;
236 const UNSIGNED_FLAG = 0x0020;
238 const ZEROFILL_FLAG = 0x0040;
240 const BINARY_FLAG = 0x0080;
242 const ENUM_FLAG = 0x0100;
244 const AUTO_INCREMENT_FLAG = 0x0200;
246 const TIMESTAMP_FLAG = 0x0400;
248 const SET_FLAG = 0x0800;
250 const NO_DEFAULT_VALUE_FLAG = 0x1000;
252 const ON_UPDATE_NOW_FLAG = 0x2000;
254 const PART_KEY_FLAG = 0x4000;
256 const NUM_FLAG = 0x8000;
258 }
259}
260
261#[expect(non_camel_case_types)]
262#[repr(u8)]
263#[derive(Debug, Clone, Copy, PartialEq, Eq)]
264pub enum ColumnType {
265 MYSQL_TYPE_DECIMAL = 0x00,
266 MYSQL_TYPE_TINY = 0x01,
267 MYSQL_TYPE_SHORT = 0x02,
268 MYSQL_TYPE_LONG = 0x03,
269 MYSQL_TYPE_FLOAT = 0x04,
270 MYSQL_TYPE_DOUBLE = 0x05,
271 MYSQL_TYPE_NULL = 0x06,
272 MYSQL_TYPE_TIMESTAMP = 0x07,
273 MYSQL_TYPE_LONGLONG = 0x08,
274 MYSQL_TYPE_INT24 = 0x09,
275 MYSQL_TYPE_DATE = 0x0a,
276 MYSQL_TYPE_TIME = 0x0b,
277 MYSQL_TYPE_DATETIME = 0x0c,
278 MYSQL_TYPE_YEAR = 0x0d,
279 MYSQL_TYPE_NEWDATE = 0x0e,
280 MYSQL_TYPE_VARCHAR = 0x0f,
281 MYSQL_TYPE_BIT = 0x10,
282 MYSQL_TYPE_TIMESTAMP2 = 0x11,
283 MYSQL_TYPE_DATETIME2 = 0x12,
284 MYSQL_TYPE_TIME2 = 0x13,
285 MYSQL_TYPE_TYPED_ARRAY = 0x14,
286 MYSQL_TYPE_JSON = 0xf5,
287 MYSQL_TYPE_NEWDECIMAL = 0xf6,
288 MYSQL_TYPE_ENUM = 0xf7,
289 MYSQL_TYPE_SET = 0xf8,
290 MYSQL_TYPE_TINY_BLOB = 0xf9,
291 MYSQL_TYPE_MEDIUM_BLOB = 0xfa,
292 MYSQL_TYPE_LONG_BLOB = 0xfb,
293 MYSQL_TYPE_BLOB = 0xfc,
294 MYSQL_TYPE_VAR_STRING = 0xfd,
295 MYSQL_TYPE_STRING = 0xfe,
296 MYSQL_TYPE_GEOMETRY = 0xff,
297}
298
299impl ColumnType {
300 pub fn from_u8(value: u8) -> Option<Self> {
301 match value {
302 0x00 => Some(Self::MYSQL_TYPE_DECIMAL),
303 0x01 => Some(Self::MYSQL_TYPE_TINY),
304 0x02 => Some(Self::MYSQL_TYPE_SHORT),
305 0x03 => Some(Self::MYSQL_TYPE_LONG),
306 0x04 => Some(Self::MYSQL_TYPE_FLOAT),
307 0x05 => Some(Self::MYSQL_TYPE_DOUBLE),
308 0x06 => Some(Self::MYSQL_TYPE_NULL),
309 0x07 => Some(Self::MYSQL_TYPE_TIMESTAMP),
310 0x08 => Some(Self::MYSQL_TYPE_LONGLONG),
311 0x09 => Some(Self::MYSQL_TYPE_INT24),
312 0x0a => Some(Self::MYSQL_TYPE_DATE),
313 0x0b => Some(Self::MYSQL_TYPE_TIME),
314 0x0c => Some(Self::MYSQL_TYPE_DATETIME),
315 0x0d => Some(Self::MYSQL_TYPE_YEAR),
316 0x0e => Some(Self::MYSQL_TYPE_NEWDATE),
317 0x0f => Some(Self::MYSQL_TYPE_VARCHAR),
318 0x10 => Some(Self::MYSQL_TYPE_BIT),
319 0x11 => Some(Self::MYSQL_TYPE_TIMESTAMP2),
320 0x12 => Some(Self::MYSQL_TYPE_DATETIME2),
321 0x13 => Some(Self::MYSQL_TYPE_TIME2),
322 0x14 => Some(Self::MYSQL_TYPE_TYPED_ARRAY),
323 0xf5 => Some(Self::MYSQL_TYPE_JSON),
324 0xf6 => Some(Self::MYSQL_TYPE_NEWDECIMAL),
325 0xf7 => Some(Self::MYSQL_TYPE_ENUM),
326 0xf8 => Some(Self::MYSQL_TYPE_SET),
327 0xf9 => Some(Self::MYSQL_TYPE_TINY_BLOB),
328 0xfa => Some(Self::MYSQL_TYPE_MEDIUM_BLOB),
329 0xfb => Some(Self::MYSQL_TYPE_LONG_BLOB),
330 0xfc => Some(Self::MYSQL_TYPE_BLOB),
331 0xfd => Some(Self::MYSQL_TYPE_VAR_STRING),
332 0xfe => Some(Self::MYSQL_TYPE_STRING),
333 0xff => Some(Self::MYSQL_TYPE_GEOMETRY),
334 _ => None,
335 }
336 }
337}