1 module mysql.protocol;
2 
3 
4 enum CapabilityFlags : uint {
5 	CLIENT_LONG_PASSWORD                = 0x00000001,  // Use the improved version of Old Password Authentication
6 	CLIENT_FOUND_ROWS                   = 0x00000002,  // Send found rows instead of affected rows in EOF_Packet
7 	CLIENT_LONG_FLAG                    = 0x00000004,  // Longer flags in Protocol::ColumnDefinition320
8 	CLIENT_CONNECT_WITH_DB              = 0x00000008,  // One can specify db on connect in Handshake Response Packet
9 	CLIENT_NO_SCHEMA                    = 0x00000010,  // Don't allow database.table.column
10 	CLIENT_COMPRESS                     = 0x00000020,  // Compression protocol supported
11 	CLIENT_ODBC                         = 0x00000040,  // Special handling of ODBC behaviour
12 	CLIENT_LOCAL_FILES                  = 0x00000080,  // Can use LOAD DATA LOCAL
13 	CLIENT_IGNORE_SPACE                 = 0x00000100,  // Parser can ignore spaces before '('
14 	CLIENT_PROTOCOL_41                  = 0x00000200,  // Supports the 4.1 protocol
15 	CLIENT_INTERACTIVE                  = 0x00000400,  // wait_timeout vs. wait_interactive_timeout
16 	CLIENT_SSL                          = 0x00000800,  // Supports SSL
17 	CLIENT_IGNORE_SIGPIPE               = 0x00001000,  // Don't issue SIGPIPE if network failures (libmysqlclient only)
18 	CLIENT_TRANSACTIONS                 = 0x00002000,  // Can send status flags in EOF_Packet
19 	CLIENT_RESERVED                     = 0x00004000,  // Unused
20 	CLIENT_SECURE_CONNECTION            = 0x00008000,  // Supports Authentication::Native41
21 	CLIENT_MULTI_STATEMENTS             = 0x00010000,  // Can handle multiple statements per COM_QUERY and COM_STMT_PREPARE
22 	CLIENT_MULTI_RESULTS                = 0x00020000,  // Can send multiple resultsets for COM_QUERY
23 	CLIENT_PS_MULTI_RESULTS             = 0x00040000,  // Can send multiple resultsets for COM_STMT_EXECUTE
24 	CLIENT_PLUGIN_AUTH                  = 0x00080000,  // Sends extra data in Initial Handshake Packet and supports the pluggable authentication protocol.
25 	CLIENT_CONNECT_ATTRS                = 0x00100000,  // Allows connection attributes in Protocol::HandshakeResponse41
26 	CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA = 0x00200000,  // Understands length encoded integer for auth response data in Protocol::HandshakeResponse41
27 	CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS = 0x00400000,  // Announces support for expired password extension
28 	CLIENT_SESSION_TRACK                = 0x00800000,  // Can set SERVER_SESSION_STATE_CHANGED in the Status Flags and send session-state change data after a OK packet
29 	CLIENT_DEPRECATE_EOF                = 0x01000000,  // Can send OK after a Text Resultset
30 }
31 
32 
33 enum StatusFlags : ushort {
34 	SERVER_STATUS_IN_TRANS	            = 0x0001,  // A transaction is active
35 	SERVER_STATUS_AUTOCOMMIT	        = 0x0002,  // auto-commit is enabled
36 	SERVER_MORE_RESULTS_EXISTS	        = 0x0008,
37 	SERVER_STATUS_NO_GOOD_INDEX_USED    = 0x0010,
38 	SERVER_STATUS_NO_INDEX_USED	        = 0x0020,
39 	SERVER_STATUS_CURSOR_EXISTS	        = 0x0040,  // Used by Binary Protocol Resultset to signal that COM_STMT_FETCH has to be used to fetch the row-data.
40 	SERVER_STATUS_LAST_ROW_SENT	        = 0x0080,
41 	SERVER_STATUS_DB_DROPPED	        = 0x0100,
42 	SERVER_STATUS_NO_BACKSLASH_ESCAPES	= 0x0200,
43 	SERVER_STATUS_METADATA_CHANGED	    = 0x0400,
44 	SERVER_QUERY_WAS_SLOW	            = 0x0800,
45 	SERVER_PS_OUT_PARAMS	            = 0x1000,
46 	SERVER_STATUS_IN_TRANS_READONLY	    = 0x2000,  // In a read-only transaction
47 	SERVER_SESSION_STATE_CHANGED	    = 0x4000,  // connection state information has changed
48 }
49 
50 
51 enum SessionStateType : ubyte {
52 	SESSION_TRACK_SYSTEM_VARIABLES,
53 	SESSION_TRACK_SCHEMA,
54 	SESSION_TRACK_STATE_CHANGE,
55 	SESSION_TRACK_GTIDS,
56 	SESSION_TRACK_TRANSACTION_CHARACTERISTICS,
57 	SESSION_TRACK_TRANSACTION_STATE
58 }
59 
60 
61 enum StatusPackets : ubyte {
62 	OK_Packet   = 0,
63 	ERR_Packet  = 0xff,
64 	EOF_Packet  = 0xfe,
65 }
66 
67 
68 enum Commands : ubyte {
69 	//COM_SLEEP           = 0x00,
70 	COM_QUIT            = 0x01,
71 	COM_INIT_DB         = 0x02,
72 	COM_QUERY           = 0x03,
73 	COM_FIELD_LIST      = 0x04,
74 	COM_CREATE_DB       = 0x05,
75 	COM_DROP_DB         = 0x06,
76 	COM_REFRESH         = 0x07,
77 	//COM_SHUTDOWN        = 0x08,
78 	COM_STATISTICS      = 0x09,
79 	COM_PROCESS_INFO    = 0x0a,
80 	//COM_CONNECT         = 0x0b,
81 	COM_PROCESS_KILL    = 0x0c,
82 	COM_DEBUG           = 0x0d,
83 	COM_PING            = 0x0e,
84 	//COM_TIME            = 0x0f,
85 	//COM_DELAYED_INSERT  = 0x10,
86 	COM_CHANGE_USER     = 0x11,
87 	COM_BINLOG_DUMP     = 0x12,
88 	COM_TABLE_DUMP      = 0x13,
89 	//COM_CONNECT_OUT     = 0x14,
90 	COM_REGISTER_SLAVE  = 0x15,
91 	COM_STMT_PREPARE    = 0x16,
92 	COM_STMT_EXECUTE    = 0x17,
93 	COM_STMT_SEND_LONG_DATA = 0x18,
94 	COM_STMT_CLOSE      = 0x19,
95 	COM_STMT_RESET      = 0x1a,
96 	COM_SET_OPTION      = 0x1b,
97 	COM_STMT_FETCH      = 0x1c,
98 	//COM_DAEMON          = 0x1d,
99 	COM_BINLOG_DUMP_GTID = 0x1e,
100 	COM_RESET_CONNECTION = 0x1f,
101 }
102 
103 
104 enum Cursors : ubyte {
105 	CURSOR_TYPE_NO_CURSOR   = 0x00,
106 	CURSOR_TYPE_READ_ONLY   = 0x01,
107 	CURSOR_TYPE_FOR_UPDATE  = 0x02,
108 	CURSOR_TYPE_SCROLLABLE  = 0x04,
109 }
110 
111 
112 enum ColumnTypes : ubyte {
113 	MYSQL_TYPE_DECIMAL      = 0x00,
114 	MYSQL_TYPE_TINY         = 0x01,
115 	MYSQL_TYPE_SHORT        = 0x02,
116 	MYSQL_TYPE_LONG	        = 0x03,
117 	MYSQL_TYPE_FLOAT	    = 0x04,
118 	MYSQL_TYPE_DOUBLE	    = 0x05,
119 	MYSQL_TYPE_NULL	        = 0x06,
120 	MYSQL_TYPE_TIMESTAMP	= 0x07,
121 	MYSQL_TYPE_LONGLONG	    = 0x08,
122 	MYSQL_TYPE_INT24	    = 0x09,
123 	MYSQL_TYPE_DATE	        = 0x0a,
124 	MYSQL_TYPE_TIME	        = 0x0b,
125 	MYSQL_TYPE_DATETIME	    = 0x0c,
126 	MYSQL_TYPE_YEAR	        = 0x0d,
127 	MYSQL_TYPE_NEWDATE  	= 0x0e,
128 	MYSQL_TYPE_VARCHAR	    = 0x0f,
129 	MYSQL_TYPE_BIT	        = 0x10,
130 	MYSQL_TYPE_TIMESTAMP2   = 0x11,
131 	MYSQL_TYPE_DATETIME2    = 0x12,
132 	MYSQL_TYPE_TIME2        = 0x13,
133 	MYSQL_TYPE_JSON         = 0xf5,
134 	MYSQL_TYPE_NEWDECIMAL   = 0xf6,
135 	MYSQL_TYPE_ENUM         = 0xf7,
136 	MYSQL_TYPE_SET	        = 0xf8,
137 	MYSQL_TYPE_TINY_BLOB	= 0xf9,
138 	MYSQL_TYPE_MEDIUM_BLOB	= 0xfa,
139 	MYSQL_TYPE_LONG_BLOB	= 0xfb,
140 	MYSQL_TYPE_BLOB	        = 0xfc,
141 	MYSQL_TYPE_VAR_STRING	= 0xfd,
142 	MYSQL_TYPE_STRING	    = 0xfe,
143 	MYSQL_TYPE_GEOMETRY	    = 0xff,
144 }
145 
146 
147 auto columnTypeName(ColumnTypes type) {
148 	final switch (type) with (ColumnTypes) {
149 	case MYSQL_TYPE_DECIMAL:	return "decimal";
150 	case MYSQL_TYPE_TINY:		return "tiny";
151 	case MYSQL_TYPE_SHORT:		return "short";
152 	case MYSQL_TYPE_LONG:		return "long";
153 	case MYSQL_TYPE_FLOAT:		return "float";
154 	case MYSQL_TYPE_DOUBLE:		return "double";
155 	case MYSQL_TYPE_NULL:		return "null";
156 	case MYSQL_TYPE_TIMESTAMP:	return "timestamp";
157 	case MYSQL_TYPE_LONGLONG:	return "longlong";
158 	case MYSQL_TYPE_INT24:		return "int24";
159 	case MYSQL_TYPE_DATE:		return "date";
160 	case MYSQL_TYPE_TIME:		return "time";
161 	case MYSQL_TYPE_DATETIME:	return "datetime";
162 	case MYSQL_TYPE_YEAR:		return "year";
163 	case MYSQL_TYPE_NEWDATE:	return "newdate";
164 	case MYSQL_TYPE_VARCHAR:	return "varchar";
165 	case MYSQL_TYPE_BIT:		return "bit";
166 	case MYSQL_TYPE_TIMESTAMP2:	return "timestamp2";
167 	case MYSQL_TYPE_DATETIME2:	return "datetime2";
168 	case MYSQL_TYPE_TIME2:		return "time2";
169 	case MYSQL_TYPE_JSON:		return "json";
170 	case MYSQL_TYPE_NEWDECIMAL:	return "newdecimal";
171 	case MYSQL_TYPE_ENUM:		return "enum";
172 	case MYSQL_TYPE_SET:		return "set";
173 	case MYSQL_TYPE_TINY_BLOB:	return "tiny_blob";
174 	case MYSQL_TYPE_MEDIUM_BLOB:return "medium_blob";
175 	case MYSQL_TYPE_LONG_BLOB:	return "long_blob";
176 	case MYSQL_TYPE_BLOB:		return "blob";
177 	case MYSQL_TYPE_VAR_STRING:	return "var_string";
178 	case MYSQL_TYPE_STRING:		return "string";
179 	case MYSQL_TYPE_GEOMETRY:	return "geometry";
180 	}
181 }
182 
183 
184 enum FieldFlags : ushort {
185 	NOT_NULL_FLAG           = 0x0001, //  Field cannot be NULL
186 	PRI_KEY_FLAG	        = 0x0002, //  Field is part of a primary key
187 	UNIQUE_KEY_FLAG	        = 0x0004, //  Field is part of a unique key
188 	MULTIPLE_KEY_FLAG       = 0x0008, //  Field is part of a nonunique key
189 	BLOB_FLAG	            = 0x0010, //  Field is a BLOB or TEXT (deprecated)
190 	UNSIGNED_FLAG	        = 0x0020, //  Field has the UNSIGNED attribute
191 	ZEROFILL_FLAG	        = 0x0040, //  Field has the ZEROFILL attribute
192 	BINARY_FLAG	            = 0x0080, //  Field has the BINARY attribute
193 	ENUM_FLAG	            = 0x0100, //  Field is an ENUM
194 	AUTO_INCREMENT_FLAG	    = 0x0200, //  Field has the AUTO_INCREMENT attribute
195 	TIMESTAMP_FLAG	        = 0x0400, //  Field is a TIMESTAMP (deprecated)
196 	SET_FLAG	            = 0x0800, //  Field is a SET
197 	NO_DEFAULT_VALUE_FLAG   = 0x1000, //  Field has no default value; see additional notes following table
198 	ON_UPDATE_NOW_FLAG      = 0x2000, // Field is set to NOW on UPDATE
199 //    PART_KEY_FLAG           = 0x4000, //  Intern; Part of some key
200 	NUM_FLAG	            = 0x8000, //  Field is numeric
201 }
202 
203 
204 enum ErrorCodes : ushort {
205 	ER_DUP_KEYNAME                  = 1061,
206 	ER_DUP_ENTRY                    = 1062,
207 	ER_DUP_ENTRY_WITH_KEY_NAME      = 1586,
208 	ER_DEADLOCK_FOUND				= 1213,
209 	ER_DATA_TOO_LONG_FOR_COL		= 1406,
210 	ER_TABLE_DOESNT_EXIST			= 1146,
211 	ER_LOCK_WAIT_TIMEOUT			= 1205,
212 }