1 /*
2  * Drizzle Client & Protocol Library
3  *
4  * Copyright (C) 2008 Eric Day (eday@oddments.org)
5  * All rights reserved.
6  *
7  * Use and distribution licensed under the BSD license.  See
8  * the COPYING file in this directory for full text.
9  */
10 
11 /**
12  * @file
13  * @brief Defines, typedefs, enums, and macros
14  */
15 
16 #ifndef __DRIZZLE_CONSTANTS_H
17 #define __DRIZZLE_CONSTANTS_H
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /**
24  * @addtogroup drizzle_constants Constants
25  * @ingroup drizzle_client_interface
26  * @ingroup drizzle_server_interface
27  * @{
28  */
29 
30 /**
31  * @todo Remove these with next major API change.
32  */
33 #define DRIZZLE_RETURN_SERVER_GONE DRIZZLE_RETURN_LOST_CONNECTION
34 #define DRIZZLE_RETURN_EOF DRIZZLE_RETURN_LOST_CONNECTION
35 #define DRIZZLE_COLUMN_TYPE_VIRTUAL 17
36 
37 /* Defines. */
38 #define DRIZZLE_DEFAULT_TCP_HOST         "127.0.0.1"
39 #define DRIZZLE_DEFAULT_TCP_PORT         4427
40 #define DRIZZLE_DEFAULT_TCP_PORT_MYSQL   3306
41 #define DRIZZLE_DEFAULT_UDS              "/tmp/drizzle.sock"
42 #define DRIZZLE_DEFAULT_UDS_MYSQL        "/tmp/mysql.sock"
43 #define DRIZZLE_DEFAULT_BACKLOG          64
44 #define DRIZZLE_MAX_ERROR_SIZE           2048
45 #define DRIZZLE_MAX_USER_SIZE            64
46 #define DRIZZLE_MAX_PASSWORD_SIZE        32
47 #define DRIZZLE_MAX_DB_SIZE              64
48 #define DRIZZLE_MAX_INFO_SIZE            2048
49 #define DRIZZLE_MAX_SQLSTATE_SIZE        5
50 #define DRIZZLE_MAX_CATALOG_SIZE         128
51 #define DRIZZLE_MAX_TABLE_SIZE           128
52 #define DRIZZLE_MAX_COLUMN_NAME_SIZE     2048
53 #define DRIZZLE_MAX_DEFAULT_VALUE_SIZE   2048
54 #define DRIZZLE_MAX_PACKET_SIZE          UINT32_MAX
55 #define DRIZZLE_MAX_BUFFER_SIZE          32768
56 #define DRIZZLE_BUFFER_COPY_THRESHOLD    8192
57 #define DRIZZLE_MAX_SERVER_VERSION_SIZE  32
58 #define DRIZZLE_MAX_SCRAMBLE_SIZE        20
59 #define DRIZZLE_STATE_STACK_SIZE         8
60 #define DRIZZLE_ROW_GROW_SIZE            8192
61 #define DRIZZLE_DEFAULT_SOCKET_TIMEOUT   10
62 #define DRIZZLE_DEFAULT_SOCKET_SEND_SIZE 32768
63 #define DRIZZLE_DEFAULT_SOCKET_RECV_SIZE 32768
64 
65 /**
66  * Return codes.
67  */
68 typedef enum
69 {
70   DRIZZLE_RETURN_OK,
71   DRIZZLE_RETURN_IO_WAIT,
72   DRIZZLE_RETURN_PAUSE,
73   DRIZZLE_RETURN_ROW_BREAK,
74   DRIZZLE_RETURN_MEMORY,
75   DRIZZLE_RETURN_ERRNO,
76   DRIZZLE_RETURN_INTERNAL_ERROR,
77   DRIZZLE_RETURN_GETADDRINFO,
78   DRIZZLE_RETURN_NOT_READY,
79   DRIZZLE_RETURN_BAD_PACKET_NUMBER,
80   DRIZZLE_RETURN_BAD_HANDSHAKE_PACKET,
81   DRIZZLE_RETURN_BAD_PACKET,
82   DRIZZLE_RETURN_PROTOCOL_NOT_SUPPORTED,
83   DRIZZLE_RETURN_UNEXPECTED_DATA,
84   DRIZZLE_RETURN_NO_SCRAMBLE,
85   DRIZZLE_RETURN_AUTH_FAILED,
86   DRIZZLE_RETURN_NULL_SIZE,
87   DRIZZLE_RETURN_ERROR_CODE,
88   DRIZZLE_RETURN_TOO_MANY_COLUMNS,
89   DRIZZLE_RETURN_ROW_END,
90   DRIZZLE_RETURN_LOST_CONNECTION,
91   DRIZZLE_RETURN_COULD_NOT_CONNECT,
92   DRIZZLE_RETURN_NO_ACTIVE_CONNECTIONS,
93   DRIZZLE_RETURN_HANDSHAKE_FAILED,
94   DRIZZLE_RETURN_TIMEOUT,
95   DRIZZLE_RETURN_MAX /* Always add new codes to the end before this one. */
96 } drizzle_return_t;
97 
98 /**
99  * Verbosity levels.
100  */
101 typedef enum
102 {
103   DRIZZLE_VERBOSE_NEVER,
104   DRIZZLE_VERBOSE_FATAL,
105   DRIZZLE_VERBOSE_ERROR,
106   DRIZZLE_VERBOSE_INFO,
107   DRIZZLE_VERBOSE_DEBUG,
108   DRIZZLE_VERBOSE_CRAZY,
109   DRIZZLE_VERBOSE_MAX
110 } drizzle_verbose_t;
111 
112 /** @} */
113 
114 /**
115  * @ingroup drizzle
116  * Options for drizzle_st.
117  */
118 typedef enum
119 {
120   DRIZZLE_NONE=            0,
121   DRIZZLE_ALLOCATED=       (1 << 0),
122   DRIZZLE_NON_BLOCKING=    (1 << 1),
123   DRIZZLE_FREE_OBJECTS=    (1 << 2),
124   DRIZZLE_ASSERT_DANGLING= (1 << 3)
125 } drizzle_options_t;
126 
127 /**
128  * @ingroup drizzle_con
129  * Options for drizzle_con_st.
130  */
131 typedef enum
132 {
133   DRIZZLE_CON_NONE=           0,
134   DRIZZLE_CON_ALLOCATED=      (1 << 0),
135   DRIZZLE_CON_MYSQL=          (1 << 1),
136   DRIZZLE_CON_RAW_PACKET=     (1 << 2),
137   DRIZZLE_CON_RAW_SCRAMBLE=   (1 << 3),
138   DRIZZLE_CON_READY=          (1 << 4),
139   DRIZZLE_CON_NO_RESULT_READ= (1 << 5),
140   DRIZZLE_CON_IO_READY=       (1 << 6),
141   DRIZZLE_CON_LISTEN=         (1 << 7),
142   DRIZZLE_CON_EXPERIMENTAL=   (1 << 8)
143 } drizzle_con_options_t;
144 
145 /**
146  * @ingroup drizzle_con
147  * Socket types for drizzle_con_st.
148  */
149 typedef enum
150 {
151   DRIZZLE_CON_SOCKET_TCP= 0,
152   DRIZZLE_CON_SOCKET_UDS= (1 << 0)
153 } drizzle_con_socket_t;
154 
155 /**
156  * @ingroup drizzle_con
157  * Status flags for drizle_con_st.
158  */
159 typedef enum
160 {
161   DRIZZLE_CON_STATUS_NONE=                     0,
162   DRIZZLE_CON_STATUS_IN_TRANS=                 (1 << 0),
163   DRIZZLE_CON_STATUS_AUTOCOMMIT=               (1 << 1),
164   DRIZZLE_CON_STATUS_MORE_RESULTS_EXISTS=      (1 << 3),
165   DRIZZLE_CON_STATUS_QUERY_NO_GOOD_INDEX_USED= (1 << 4),
166   DRIZZLE_CON_STATUS_QUERY_NO_INDEX_USED=      (1 << 5),
167   DRIZZLE_CON_STATUS_CURSOR_EXISTS=            (1 << 6),
168   DRIZZLE_CON_STATUS_LAST_ROW_SENT=            (1 << 7),
169   DRIZZLE_CON_STATUS_DB_DROPPED=               (1 << 8),
170   DRIZZLE_CON_STATUS_NO_BACKSLASH_ESCAPES=     (1 << 9),
171   DRIZZLE_CON_STATUS_QUERY_WAS_SLOW=           (1 << 10)
172 } drizzle_con_status_t;
173 
174 /**
175  * @ingroup drizzle_con
176  * Capabilities for drizzle_con_st.
177  */
178 typedef enum
179 {
180   DRIZZLE_CAPABILITIES_NONE=                   0,
181   DRIZZLE_CAPABILITIES_LONG_PASSWORD=          (1 << 0),
182   DRIZZLE_CAPABILITIES_FOUND_ROWS=             (1 << 1),
183   DRIZZLE_CAPABILITIES_LONG_FLAG=              (1 << 2),
184   DRIZZLE_CAPABILITIES_CONNECT_WITH_DB=        (1 << 3),
185   DRIZZLE_CAPABILITIES_NO_SCHEMA=              (1 << 4),
186   DRIZZLE_CAPABILITIES_COMPRESS=               (1 << 5),
187   DRIZZLE_CAPABILITIES_ODBC=                   (1 << 6),
188   DRIZZLE_CAPABILITIES_LOCAL_FILES=            (1 << 7),
189   DRIZZLE_CAPABILITIES_IGNORE_SPACE=           (1 << 8),
190   DRIZZLE_CAPABILITIES_PROTOCOL_41=            (1 << 9),
191   DRIZZLE_CAPABILITIES_INTERACTIVE=            (1 << 10),
192   DRIZZLE_CAPABILITIES_SSL=                    (1 << 11),
193   DRIZZLE_CAPABILITIES_IGNORE_SIGPIPE=         (1 << 12),
194   DRIZZLE_CAPABILITIES_TRANSACTIONS=           (1 << 13),
195   DRIZZLE_CAPABILITIES_RESERVED=               (1 << 14),
196   DRIZZLE_CAPABILITIES_SECURE_CONNECTION=      (1 << 15),
197   DRIZZLE_CAPABILITIES_MULTI_STATEMENTS=       (1 << 16),
198   DRIZZLE_CAPABILITIES_MULTI_RESULTS=          (1 << 17),
199   DRIZZLE_CAPABILITIES_SSL_VERIFY_SERVER_CERT= (1 << 30),
200   DRIZZLE_CAPABILITIES_REMEMBER_OPTIONS=       (1 << 31),
201   DRIZZLE_CAPABILITIES_CLIENT= (DRIZZLE_CAPABILITIES_LONG_PASSWORD |
202                                 DRIZZLE_CAPABILITIES_LONG_FLAG |
203                                 DRIZZLE_CAPABILITIES_CONNECT_WITH_DB |
204                                 DRIZZLE_CAPABILITIES_TRANSACTIONS |
205                                 DRIZZLE_CAPABILITIES_PROTOCOL_41 |
206                                 DRIZZLE_CAPABILITIES_SECURE_CONNECTION)
207 } drizzle_capabilities_t;
208 
209 /**
210  * @ingroup drizzle_command
211  * Commands for drizzle_command functions.
212  */
213 typedef enum
214 {
215   DRIZZLE_COMMAND_SLEEP,               /* Not used currently. */
216   DRIZZLE_COMMAND_QUIT,
217   DRIZZLE_COMMAND_INIT_DB,
218   DRIZZLE_COMMAND_QUERY,
219   DRIZZLE_COMMAND_FIELD_LIST,          /* Deprecated. */
220   DRIZZLE_COMMAND_CREATE_DB,           /* Deprecated. */
221   DRIZZLE_COMMAND_DROP_DB,             /* Deprecated. */
222   DRIZZLE_COMMAND_REFRESH,
223   DRIZZLE_COMMAND_SHUTDOWN,
224   DRIZZLE_COMMAND_STATISTICS,
225   DRIZZLE_COMMAND_PROCESS_INFO,        /* Deprecated. */
226   DRIZZLE_COMMAND_CONNECT,             /* Not used currently. */
227   DRIZZLE_COMMAND_PROCESS_KILL,        /* Deprecated. */
228   DRIZZLE_COMMAND_DEBUG,
229   DRIZZLE_COMMAND_PING,
230   DRIZZLE_COMMAND_TIME,                /* Not used currently. */
231   DRIZZLE_COMMAND_DELAYED_INSERT,      /* Not used currently. */
232   DRIZZLE_COMMAND_CHANGE_USER,
233   DRIZZLE_COMMAND_BINLOG_DUMP,         /* Not used currently. */
234   DRIZZLE_COMMAND_TABLE_DUMP,          /* Not used currently. */
235   DRIZZLE_COMMAND_CONNECT_OUT,         /* Not used currently. */
236   DRIZZLE_COMMAND_REGISTER_SLAVE,      /* Not used currently. */
237   DRIZZLE_COMMAND_STMT_PREPARE,        /* Not used currently. */
238   DRIZZLE_COMMAND_STMT_EXECUTE,        /* Not used currently. */
239   DRIZZLE_COMMAND_STMT_SEND_LONG_DATA, /* Not used currently. */
240   DRIZZLE_COMMAND_STMT_CLOSE,          /* Not used currently. */
241   DRIZZLE_COMMAND_STMT_RESET,          /* Not used currently. */
242   DRIZZLE_COMMAND_SET_OPTION,          /* Not used currently. */
243   DRIZZLE_COMMAND_STMT_FETCH,          /* Not used currently. */
244   DRIZZLE_COMMAND_DAEMON,              /* Not used currently. */
245   DRIZZLE_COMMAND_END                  /* Not used currently. */
246 } drizzle_command_t;
247 
248 /**
249  * @ingroup drizzle_command
250  * Commands for the Drizzle protocol functions.
251  */
252 typedef enum
253 {
254   DRIZZLE_COMMAND_DRIZZLE_SLEEP,
255   DRIZZLE_COMMAND_DRIZZLE_QUIT,
256   DRIZZLE_COMMAND_DRIZZLE_INIT_DB,
257   DRIZZLE_COMMAND_DRIZZLE_QUERY,
258   DRIZZLE_COMMAND_DRIZZLE_SHUTDOWN,
259   DRIZZLE_COMMAND_DRIZZLE_CONNECT,
260   DRIZZLE_COMMAND_DRIZZLE_PING,
261   DRIZZLE_COMMAND_DRIZZLE_END
262 } drizzle_command_drizzle_t;
263 
264 /**
265  * @ingroup drizzle_query
266  * Options for drizzle_query_st.
267  */
268 typedef enum
269 {
270   DRIZZLE_QUERY_ALLOCATED= (1 << 0)
271 } drizzle_query_options_t;
272 
273 /**
274  * @ingroup drizzle_query
275  * States for drizle_query_st.
276  */
277 typedef enum
278 {
279   DRIZZLE_QUERY_STATE_INIT,
280   DRIZZLE_QUERY_STATE_QUERY,
281   DRIZZLE_QUERY_STATE_RESULT,
282   DRIZZLE_QUERY_STATE_DONE
283 } drizzle_query_state_t;
284 
285 /**
286  * @ingroup drizzle_result
287  * Options for drizzle_result_st.
288  */
289 typedef enum
290 {
291   DRIZZLE_RESULT_NONE=          0,
292   DRIZZLE_RESULT_ALLOCATED=     (1 << 0),
293   DRIZZLE_RESULT_SKIP_COLUMN=   (1 << 1),
294   DRIZZLE_RESULT_BUFFER_COLUMN= (1 << 2),
295   DRIZZLE_RESULT_BUFFER_ROW=    (1 << 3),
296   DRIZZLE_RESULT_EOF_PACKET=    (1 << 4),
297   DRIZZLE_RESULT_ROW_BREAK=     (1 << 5)
298 } drizzle_result_options_t;
299 
300 /**
301  * @ingroup drizzle_column
302  * Options for drizzle_column_st.
303  */
304 typedef enum
305 {
306   DRIZZLE_COLUMN_ALLOCATED= (1 << 0)
307 } drizzle_column_options_t;
308 
309 /**
310  * @ingroup drizzle_column
311  * Types for drizzle_column_st.
312  */
313 typedef enum
314 {
315   DRIZZLE_COLUMN_TYPE_DECIMAL,
316   DRIZZLE_COLUMN_TYPE_TINY,
317   DRIZZLE_COLUMN_TYPE_SHORT,
318   DRIZZLE_COLUMN_TYPE_LONG,
319   DRIZZLE_COLUMN_TYPE_FLOAT,
320   DRIZZLE_COLUMN_TYPE_DOUBLE,
321   DRIZZLE_COLUMN_TYPE_NULL,
322   DRIZZLE_COLUMN_TYPE_TIMESTAMP,
323   DRIZZLE_COLUMN_TYPE_LONGLONG,
324   DRIZZLE_COLUMN_TYPE_INT24,
325   DRIZZLE_COLUMN_TYPE_DATE,
326   DRIZZLE_COLUMN_TYPE_TIME,
327   DRIZZLE_COLUMN_TYPE_DATETIME,
328   DRIZZLE_COLUMN_TYPE_YEAR,
329   DRIZZLE_COLUMN_TYPE_NEWDATE,
330   DRIZZLE_COLUMN_TYPE_VARCHAR,
331   DRIZZLE_COLUMN_TYPE_BIT,
332   DRIZZLE_COLUMN_TYPE_NEWDECIMAL=  246,
333   DRIZZLE_COLUMN_TYPE_ENUM=        247,
334   DRIZZLE_COLUMN_TYPE_SET=         248,
335   DRIZZLE_COLUMN_TYPE_TINY_BLOB=   249,
336   DRIZZLE_COLUMN_TYPE_MEDIUM_BLOB= 250,
337   DRIZZLE_COLUMN_TYPE_LONG_BLOB=   251,
338   DRIZZLE_COLUMN_TYPE_BLOB=        252,
339   DRIZZLE_COLUMN_TYPE_VAR_STRING=  253,
340   DRIZZLE_COLUMN_TYPE_STRING=      254,
341   DRIZZLE_COLUMN_TYPE_GEOMETRY=    255
342 } drizzle_column_type_t;
343 
344 /**
345  * @ingroup drizzle_column
346  * Types for drizzle_column_st for Drizzle.
347  */
348 typedef enum
349 {
350   DRIZZLE_COLUMN_TYPE_DRIZZLE_TINY,
351   DRIZZLE_COLUMN_TYPE_DRIZZLE_LONG,
352   DRIZZLE_COLUMN_TYPE_DRIZZLE_DOUBLE,
353   DRIZZLE_COLUMN_TYPE_DRIZZLE_NULL,
354   DRIZZLE_COLUMN_TYPE_DRIZZLE_TIMESTAMP,
355   DRIZZLE_COLUMN_TYPE_DRIZZLE_LONGLONG,
356   DRIZZLE_COLUMN_TYPE_DRIZZLE_DATETIME,
357   DRIZZLE_COLUMN_TYPE_DRIZZLE_DATE,
358   DRIZZLE_COLUMN_TYPE_DRIZZLE_VARCHAR,
359   DRIZZLE_COLUMN_TYPE_DRIZZLE_NEWDECIMAL,
360   DRIZZLE_COLUMN_TYPE_DRIZZLE_ENUM,
361   DRIZZLE_COLUMN_TYPE_DRIZZLE_BLOB,
362   DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX=DRIZZLE_COLUMN_TYPE_DRIZZLE_BLOB
363 } drizzle_column_type_drizzle_t;
364 
365 /**
366  * @ingroup drizzle_column
367  * Flags for drizzle_column_st.
368  */
369 typedef enum
370 {
371   DRIZZLE_COLUMN_FLAGS_NONE=             0,
372   DRIZZLE_COLUMN_FLAGS_NOT_NULL=         (1 << 0),
373   DRIZZLE_COLUMN_FLAGS_PRI_KEY=          (1 << 1),
374   DRIZZLE_COLUMN_FLAGS_UNIQUE_KEY=       (1 << 2),
375   DRIZZLE_COLUMN_FLAGS_MULTIPLE_KEY=     (1 << 3),
376   DRIZZLE_COLUMN_FLAGS_BLOB=             (1 << 4),
377   DRIZZLE_COLUMN_FLAGS_UNSIGNED=         (1 << 5),
378   DRIZZLE_COLUMN_FLAGS_ZEROFILL=         (1 << 6),
379   DRIZZLE_COLUMN_FLAGS_BINARY=           (1 << 7),
380   DRIZZLE_COLUMN_FLAGS_ENUM=             (1 << 8),
381   DRIZZLE_COLUMN_FLAGS_AUTO_INCREMENT=   (1 << 9),
382   DRIZZLE_COLUMN_FLAGS_TIMESTAMP=        (1 << 10),
383   DRIZZLE_COLUMN_FLAGS_SET=              (1 << 11),
384   DRIZZLE_COLUMN_FLAGS_NO_DEFAULT_VALUE= (1 << 12),
385   DRIZZLE_COLUMN_FLAGS_ON_UPDATE_NOW=    (1 << 13),
386   DRIZZLE_COLUMN_FLAGS_PART_KEY=         (1 << 14),
387   DRIZZLE_COLUMN_FLAGS_NUM=              (1 << 15),
388   DRIZZLE_COLUMN_FLAGS_GROUP=            (1 << 15), /* NUM & GROUP the same. */
389   DRIZZLE_COLUMN_FLAGS_UNIQUE=           (1 << 16),
390   DRIZZLE_COLUMN_FLAGS_BINCMP=           (1 << 17),
391   DRIZZLE_COLUMN_FLAGS_GET_FIXED_FIELDS= (1 << 18),
392   DRIZZLE_COLUMN_FLAGS_IN_PART_FUNC=     (1 << 19),
393   DRIZZLE_COLUMN_FLAGS_IN_ADD_INDEX=     (1 << 20),
394   DRIZZLE_COLUMN_FLAGS_RENAMED=          (1 << 21)
395 } drizzle_column_flags_t;
396 
397 /**
398  * @addtogroup drizzle_types Types
399  * @ingroup drizzle_client_interface
400  * @ingroup drizzle_server_interface
401  * @{
402  */
403 
404 /* Types. */
405 typedef struct drizzle_st drizzle_st;
406 typedef struct drizzle_con_tcp_st drizzle_con_tcp_st;
407 typedef struct drizzle_con_uds_st drizzle_con_uds_st;
408 typedef struct drizzle_con_st drizzle_con_st;
409 typedef struct drizzle_query_st drizzle_query_st;
410 typedef struct drizzle_result_st drizzle_result_st;
411 typedef struct drizzle_column_st drizzle_column_st;
412 typedef char *drizzle_field_t;
413 typedef drizzle_field_t *drizzle_row_t;
414 typedef uint8_t drizzle_charset_t;
415 
416 /* Function types. */
417 typedef void (drizzle_context_free_fn)(drizzle_st *drizzle,
418                                        void *context);
419 typedef void (drizzle_log_fn)(const char *line, drizzle_verbose_t verbose,
420                               void *context);
421 typedef drizzle_return_t (drizzle_state_fn)(drizzle_con_st *con);
422 typedef void (drizzle_con_context_free_fn)(drizzle_con_st *con,
423                                            void *context);
424 typedef void (drizzle_query_context_free_fn)(drizzle_query_st *query,
425                                              void *context);
426 /**
427  * Custom function to register or deregister interest in file descriptor
428  * events. See drizzle_set_event_watch_fn().
429  *
430  * @param[in] con Connection that has changed the events it is interested in.
431  *  Use drizzle_con_fd() to get the file descriptor.
432  * @param[in] events A bit mask of POLLIN | POLLOUT, specifying if the
433  *  connection is waiting for read or write events.
434  * @param[in] context Application context pointer registered with
435  *  drizzle_set_event_watch_fn().
436  * @return DRIZZLE_RETURN_OK if successful.
437  */
438 typedef drizzle_return_t (drizzle_event_watch_fn)(drizzle_con_st *con,
439                                                   short events,
440                                                   void *context);
441 
442 /** @} */
443 
444 /**
445  * @addtogroup drizzle_macros Macros
446  * @ingroup drizzle_client_interface
447  * @ingroup drizzle_server_interface
448  * @{
449  */
450 
451 /* Protocol unpacking macros. */
452 #define drizzle_get_byte2(__buffer) \
453   (uint16_t)((__buffer)[0] | \
454             ((__buffer)[1] << 8))
455 #define drizzle_get_byte3(__buffer) \
456   (uint32_t)((__buffer)[0] | \
457             ((__buffer)[1] << 8) | \
458             ((__buffer)[2] << 16))
459 #define drizzle_get_byte4(__buffer) \
460   (uint32_t)((__buffer)[0] | \
461             ((__buffer)[1] << 8) | \
462             ((__buffer)[2] << 16) | \
463             ((__buffer)[3] << 24))
464 #define drizzle_get_byte8(__buffer) \
465   ((uint64_t)(__buffer)[0] | \
466   ((uint64_t)(__buffer)[1] << 8) | \
467   ((uint64_t)(__buffer)[2] << 16) | \
468   ((uint64_t)(__buffer)[3] << 24) | \
469   ((uint64_t)(__buffer)[4] << 32) | \
470   ((uint64_t)(__buffer)[5] << 40) | \
471   ((uint64_t)(__buffer)[6] << 48) | \
472   ((uint64_t)(__buffer)[7] << 56))
473 
474 /* Protocol packing macros. */
475 #define drizzle_set_byte2(__buffer, __int) do { \
476   (__buffer)[0]= (uint8_t)((__int) & 0xFF); \
477   (__buffer)[1]= (uint8_t)(((__int) >> 8) & 0xFF); } while (0)
478 #define drizzle_set_byte3(__buffer, __int) do { \
479   (__buffer)[0]= (uint8_t)((__int) & 0xFF); \
480   (__buffer)[1]= (uint8_t)(((__int) >> 8) & 0xFF); \
481   (__buffer)[2]= (uint8_t)(((__int) >> 16) & 0xFF); } while (0)
482 #define drizzle_set_byte4(__buffer, __int) do { \
483   (__buffer)[0]= (uint8_t)((__int) & 0xFF); \
484   (__buffer)[1]= (uint8_t)(((__int) >> 8) & 0xFF); \
485   (__buffer)[2]= (uint8_t)(((__int) >> 16) & 0xFF); \
486   (__buffer)[3]= (uint8_t)(((__int) >> 24) & 0xFF); } while (0)
487 #define drizzle_set_byte8(__buffer, __int) do { \
488   (__buffer)[0]= (uint8_t)((__int) & 0xFF); \
489   (__buffer)[1]= (uint8_t)(((__int) >> 8) & 0xFF); \
490   (__buffer)[2]= (uint8_t)(((__int) >> 16) & 0xFF); \
491   (__buffer)[3]= (uint8_t)(((__int) >> 24) & 0xFF); \
492   (__buffer)[4]= (uint8_t)(((__int) >> 32) & 0xFF); \
493   (__buffer)[5]= (uint8_t)(((__int) >> 40) & 0xFF); \
494   (__buffer)[6]= (uint8_t)(((__int) >> 48) & 0xFF); \
495   (__buffer)[7]= (uint8_t)(((__int) >> 56) & 0xFF); } while (0)
496 
497 /* Multi-byte character macros. */
498 #define drizzle_mb_char(__c) (((__c) & 0x80) != 0)
499 #define drizzle_mb_length(__c) \
500   ((uint32_t)(__c) <= 0x7f ? 1 : \
501   ((uint32_t)(__c) <= 0x7ff ? 2 : \
502   ((uint32_t)(__c) <= 0xd7ff ? 3 : \
503   ((uint32_t)(__c) <= 0xdfff || (uint32_t)(__c) > 0x10ffff ? 0 : \
504   ((uint32_t)(__c) <= 0xffff ? 3 : 4)))))
505 
506 /** @} */
507 
508 #ifdef __cplusplus
509 }
510 #endif
511 
512 #endif /* __DRIZZLE_CONSTANTS_H */
513