2
0

ma_pvio.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #ifndef _ma_pvio_h_
  2. #define _ma_pvio_h_
  3. #define cio_defined
  4. #ifdef HAVE_TLS
  5. #include <ma_tls.h>
  6. #else
  7. #define MARIADB_TLS void
  8. #endif
  9. /* CONC-492: Allow to buuld plugins outside of MariaDB Connector/C
  10. source tree wnen ma_global.h was not included. */
  11. #if !defined(_global_h) && !defined(MY_GLOBAL_INCLUDED)
  12. typedef unsigned char uchar;
  13. #endif
  14. #define PVIO_SET_ERROR if (pvio->set_error) \
  15. pvio->set_error
  16. #define PVIO_READ_AHEAD_CACHE_SIZE 16384
  17. #define PVIO_READ_AHEAD_CACHE_MIN_SIZE 2048
  18. #define PVIO_EINTR_TRIES 2
  19. struct st_ma_pvio_methods;
  20. typedef struct st_ma_pvio_methods PVIO_METHODS;
  21. #define IS_PVIO_ASYNC(a) \
  22. ((a)->mysql && (a)->mysql->options.extension && (a)->mysql->options.extension->async_context)
  23. #define IS_PVIO_ASYNC_ACTIVE(a) \
  24. (IS_PVIO_ASYNC(a)&& (a)->mysql->options.extension->async_context->active)
  25. #define IS_MYSQL_ASYNC(a) \
  26. ((a)->options.extension && (a)->options.extension->async_context)
  27. #define IS_MYSQL_ASYNC_ACTIVE(a) \
  28. (IS_MYSQL_ASYNC(a)&& (a)->options.extension->async_context->active)
  29. enum enum_pvio_timeout {
  30. PVIO_CONNECT_TIMEOUT= 0,
  31. PVIO_READ_TIMEOUT,
  32. PVIO_WRITE_TIMEOUT
  33. };
  34. enum enum_pvio_io_event
  35. {
  36. VIO_IO_EVENT_READ,
  37. VIO_IO_EVENT_WRITE,
  38. VIO_IO_EVENT_CONNECT
  39. };
  40. enum enum_pvio_type {
  41. PVIO_TYPE_UNIXSOCKET= 0,
  42. PVIO_TYPE_SOCKET,
  43. PVIO_TYPE_NAMEDPIPE,
  44. PVIO_TYPE_SHAREDMEM,
  45. };
  46. enum enum_pvio_operation {
  47. PVIO_READ= 0,
  48. PVIO_WRITE=1
  49. };
  50. #define SHM_DEFAULT_NAME "MYSQL"
  51. struct st_pvio_callback;
  52. typedef struct st_pvio_callback {
  53. void (*callback)(MYSQL *mysql, uchar *buffer, size_t size);
  54. struct st_pvio_callback *next;
  55. } PVIO_CALLBACK;
  56. struct st_ma_pvio {
  57. void *data;
  58. /* read ahead cache */
  59. uchar *cache;
  60. uchar *cache_pos;
  61. size_t cache_size;
  62. enum enum_pvio_type type;
  63. int timeout[3];
  64. int ssl_type; /* todo: change to enum (ssl plugins) */
  65. MARIADB_TLS *ctls;
  66. MYSQL *mysql;
  67. PVIO_METHODS *methods;
  68. void (*set_error)(MYSQL *mysql, unsigned int error_nr, const char *sqlstate, const char *format, ...);
  69. void (*callback)(MARIADB_PVIO *pvio, my_bool is_read, const uchar *buffer, size_t length);
  70. };
  71. typedef struct st_ma_pvio_cinfo
  72. {
  73. const char *host;
  74. const char *unix_socket;
  75. int port;
  76. enum enum_pvio_type type;
  77. MYSQL *mysql;
  78. } MA_PVIO_CINFO;
  79. struct st_ma_pvio_methods
  80. {
  81. my_bool (*set_timeout)(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout);
  82. int (*get_timeout)(MARIADB_PVIO *pvio, enum enum_pvio_timeout type);
  83. ssize_t (*read)(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
  84. ssize_t (*async_read)(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
  85. ssize_t (*write)(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
  86. ssize_t (*async_write)(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
  87. int (*wait_io_or_timeout)(MARIADB_PVIO *pvio, my_bool is_read, int timeout);
  88. int (*blocking)(MARIADB_PVIO *pvio, my_bool value, my_bool *old_value);
  89. my_bool (*connect)(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo);
  90. my_bool (*close)(MARIADB_PVIO *pvio);
  91. int (*fast_send)(MARIADB_PVIO *pvio);
  92. int (*keepalive)(MARIADB_PVIO *pvio);
  93. my_bool (*get_handle)(MARIADB_PVIO *pvio, void *handle);
  94. my_bool (*is_blocking)(MARIADB_PVIO *pvio);
  95. my_bool (*is_alive)(MARIADB_PVIO *pvio);
  96. my_bool (*has_data)(MARIADB_PVIO *pvio, ssize_t *data_len);
  97. int(*shutdown)(MARIADB_PVIO *pvio);
  98. };
  99. /* Function prototypes */
  100. MARIADB_PVIO *ma_pvio_init(MA_PVIO_CINFO *cinfo);
  101. void ma_pvio_close(MARIADB_PVIO *pvio);
  102. ssize_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
  103. ssize_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
  104. ssize_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
  105. int ma_pvio_get_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type);
  106. my_bool ma_pvio_set_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout);
  107. int ma_pvio_fast_send(MARIADB_PVIO *pvio);
  108. int ma_pvio_keepalive(MARIADB_PVIO *pvio);
  109. my_socket ma_pvio_get_socket(MARIADB_PVIO *pvio);
  110. my_bool ma_pvio_is_blocking(MARIADB_PVIO *pvio);
  111. my_bool ma_pvio_blocking(MARIADB_PVIO *pvio, my_bool block, my_bool *previous_mode);
  112. my_bool ma_pvio_is_blocking(MARIADB_PVIO *pvio);
  113. int ma_pvio_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeout);
  114. my_bool ma_pvio_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo);
  115. my_bool ma_pvio_is_alive(MARIADB_PVIO *pvio);
  116. my_bool ma_pvio_get_handle(MARIADB_PVIO *pvio, void *handle);
  117. my_bool ma_pvio_has_data(MARIADB_PVIO *pvio, ssize_t *length);
  118. #endif /* _ma_pvio_h_ */