mariadb_stmt.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /************************************************************************
  2. This library is free software; you can redistribute it and/or
  3. modify it under the terms of the GNU Library General Public
  4. License as published by the Free Software Foundation; either
  5. version 2 of the License, or (at your option) any later version.
  6. This library is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  9. Library General Public License for more details.
  10. You should have received a copy of the GNU Library General Public
  11. License along with this library; if not, write to the Free
  12. Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  13. MA 02111-1301, USA
  14. Part of this code includes code from PHP's mysqlnd extension
  15. (written by Andrey Hristov, Georg Richter and Ulf Wendel), freely
  16. available from http://www.php.net/software
  17. *************************************************************************/
  18. #define MYSQL_NO_DATA 100
  19. #define MYSQL_DATA_TRUNCATED 101
  20. #define MYSQL_DEFAULT_PREFETCH_ROWS (unsigned long) 1
  21. /* Bind flags */
  22. #define MADB_BIND_DUMMY 1
  23. #define MARIADB_STMT_BULK_SUPPORTED(stmt)\
  24. ((stmt)->mysql && \
  25. (!((stmt)->mysql->server_capabilities & CLIENT_MYSQL) &&\
  26. ((stmt)->mysql->extension->mariadb_server_capabilities & \
  27. (MARIADB_CLIENT_STMT_BULK_OPERATIONS >> 32))))
  28. #define SET_CLIENT_STMT_ERROR(a, b, c, d) \
  29. do { \
  30. (a)->last_errno= (b);\
  31. strncpy((a)->sqlstate, (c), SQLSTATE_LENGTH);\
  32. (a)->sqlstate[SQLSTATE_LENGTH]= 0;\
  33. strncpy((a)->last_error, (d) ? (d) : ER((b)), MYSQL_ERRMSG_SIZE);\
  34. (a)->last_error[MYSQL_ERRMSG_SIZE - 1]= 0;\
  35. } while (0)
  36. #define CLEAR_CLIENT_STMT_ERROR(a) \
  37. do { \
  38. (a)->last_errno= 0;\
  39. strcpy((a)->sqlstate, "00000");\
  40. (a)->last_error[0]= 0;\
  41. } while (0)
  42. #define MYSQL_PS_SKIP_RESULT_W_LEN -1
  43. #define MYSQL_PS_SKIP_RESULT_STR -2
  44. #define STMT_ID_LENGTH 4
  45. typedef struct st_mysql_stmt MYSQL_STMT;
  46. typedef MYSQL_RES* (*mysql_stmt_use_or_store_func)(MYSQL_STMT *);
  47. enum enum_stmt_attr_type
  48. {
  49. STMT_ATTR_UPDATE_MAX_LENGTH,
  50. STMT_ATTR_CURSOR_TYPE,
  51. STMT_ATTR_PREFETCH_ROWS,
  52. /* MariaDB only */
  53. STMT_ATTR_PREBIND_PARAMS=200,
  54. STMT_ATTR_ARRAY_SIZE,
  55. STMT_ATTR_ROW_SIZE,
  56. STMT_ATTR_STATE,
  57. STMT_ATTR_CB_USER_DATA,
  58. STMT_ATTR_CB_PARAM,
  59. STMT_ATTR_CB_RESULT
  60. };
  61. enum enum_cursor_type
  62. {
  63. CURSOR_TYPE_NO_CURSOR= 0,
  64. CURSOR_TYPE_READ_ONLY= 1,
  65. CURSOR_TYPE_FOR_UPDATE= 2,
  66. CURSOR_TYPE_SCROLLABLE= 4
  67. };
  68. enum enum_indicator_type
  69. {
  70. STMT_INDICATOR_NTS=-1,
  71. STMT_INDICATOR_NONE=0,
  72. STMT_INDICATOR_NULL=1,
  73. STMT_INDICATOR_DEFAULT=2,
  74. STMT_INDICATOR_IGNORE=3,
  75. STMT_INDICATOR_IGNORE_ROW=4
  76. };
  77. /*
  78. bulk PS flags
  79. */
  80. #define STMT_BULK_FLAG_CLIENT_SEND_TYPES 128
  81. #define STMT_BULK_FLAG_INSERT_ID_REQUEST 64
  82. typedef enum mysql_stmt_state
  83. {
  84. MYSQL_STMT_INITTED = 0,
  85. MYSQL_STMT_PREPARED,
  86. MYSQL_STMT_EXECUTED,
  87. MYSQL_STMT_WAITING_USE_OR_STORE,
  88. MYSQL_STMT_USE_OR_STORE_CALLED,
  89. MYSQL_STMT_USER_FETCHING, /* fetch_row_buff or fetch_row_unbuf */
  90. MYSQL_STMT_FETCH_DONE
  91. } enum_mysqlnd_stmt_state;
  92. typedef struct st_mysql_bind
  93. {
  94. unsigned long *length; /* output length pointer */
  95. my_bool *is_null; /* Pointer to null indicator */
  96. void *buffer; /* buffer to get/put data */
  97. /* set this if you want to track data truncations happened during fetch */
  98. my_bool *error;
  99. union {
  100. unsigned char *row_ptr; /* for the current data position */
  101. char *indicator; /* indicator variable */
  102. } u;
  103. void (*store_param_func)(NET *net, struct st_mysql_bind *param);
  104. void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *,
  105. unsigned char **row);
  106. void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,
  107. unsigned char **row);
  108. /* output buffer length, must be set when fetching str/binary */
  109. unsigned long buffer_length;
  110. unsigned long offset; /* offset position for char/binary fetch */
  111. unsigned long length_value; /* Used if length is 0 */
  112. unsigned int flags; /* special flags, e.g. for dummy bind */
  113. unsigned int pack_length; /* Internal length for packed data */
  114. enum enum_field_types buffer_type; /* buffer type */
  115. my_bool error_value; /* used if error is 0 */
  116. my_bool is_unsigned; /* set if integer type is unsigned */
  117. my_bool long_data_used; /* If used with mysql_send_long_data */
  118. my_bool is_null_value; /* Used if is_null is 0 */
  119. void *extension;
  120. } MYSQL_BIND;
  121. typedef struct st_mysqlnd_upsert_result
  122. {
  123. unsigned int warning_count;
  124. unsigned int server_status;
  125. unsigned long long affected_rows;
  126. unsigned long long last_insert_id;
  127. } mysql_upsert_status;
  128. typedef struct st_mysql_cmd_buffer
  129. {
  130. unsigned char *buffer;
  131. size_t length;
  132. } MYSQL_CMD_BUFFER;
  133. typedef struct st_mysql_error_info
  134. {
  135. unsigned int error_no;
  136. char error[MYSQL_ERRMSG_SIZE+1];
  137. char sqlstate[SQLSTATE_LENGTH + 1];
  138. } mysql_error_info;
  139. typedef int (*mysql_stmt_fetch_row_func)(MYSQL_STMT *stmt, unsigned char **row);
  140. typedef void (*ps_result_callback)(void *data, unsigned int column, unsigned char **row);
  141. typedef my_bool *(*ps_param_callback)(void *data, MYSQL_BIND *bind, unsigned int row_nr);
  142. struct st_mysql_stmt
  143. {
  144. MA_MEM_ROOT mem_root;
  145. MYSQL *mysql;
  146. unsigned long stmt_id;
  147. unsigned long flags;/* cursor is set here */
  148. enum_mysqlnd_stmt_state state;
  149. MYSQL_FIELD *fields;
  150. unsigned int field_count;
  151. unsigned int param_count;
  152. unsigned char send_types_to_server;
  153. MYSQL_BIND *params;
  154. MYSQL_BIND *bind;
  155. MYSQL_DATA result; /* we don't use mysqlnd's result set logic */
  156. MYSQL_ROWS *result_cursor;
  157. my_bool bind_result_done;
  158. my_bool bind_param_done;
  159. mysql_upsert_status upsert_status;
  160. unsigned int last_errno;
  161. char last_error[MYSQL_ERRMSG_SIZE+1];
  162. char sqlstate[SQLSTATE_LENGTH + 1];
  163. my_bool update_max_length;
  164. unsigned long prefetch_rows;
  165. LIST list;
  166. my_bool cursor_exists;
  167. void *extension;
  168. mysql_stmt_fetch_row_func fetch_row_func;
  169. unsigned int execute_count;/* count how many times the stmt was executed */
  170. mysql_stmt_use_or_store_func default_rset_handler;
  171. unsigned char *request_buffer;
  172. unsigned int array_size;
  173. size_t row_size;
  174. unsigned int prebind_params;
  175. void *user_data;
  176. ps_result_callback result_callback;
  177. ps_param_callback param_callback;
  178. size_t request_length;
  179. };
  180. typedef void (*ps_field_fetch_func)(MYSQL_BIND *r_param, const MYSQL_FIELD * field, unsigned char **row);
  181. typedef struct st_mysql_perm_bind {
  182. ps_field_fetch_func func;
  183. /* should be signed int */
  184. int pack_len;
  185. unsigned long max_len;
  186. } MYSQL_PS_CONVERSION;
  187. extern MYSQL_PS_CONVERSION mysql_ps_fetch_functions[MYSQL_TYPE_GEOMETRY + 1];
  188. unsigned long ma_net_safe_read(MYSQL *mysql);
  189. void mysql_init_ps_subsystem(void);
  190. unsigned long net_field_length(unsigned char **packet);
  191. int ma_simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
  192. size_t length, my_bool skipp_check, void *opt_arg);
  193. /*
  194. * function prototypes
  195. */
  196. MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql);
  197. int STDCALL mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length);
  198. int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt);
  199. int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt);
  200. int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg, unsigned int column, unsigned long offset);
  201. int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt);
  202. unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt);
  203. my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, const void *attr);
  204. my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, void *attr);
  205. my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
  206. my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
  207. my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt);
  208. my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt);
  209. my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt);
  210. my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt, unsigned int param_number, const char *data, unsigned long length);
  211. MYSQL_RES *STDCALL mysql_stmt_result_metadata(MYSQL_STMT *stmt);
  212. MYSQL_RES *STDCALL mysql_stmt_param_metadata(MYSQL_STMT *stmt);
  213. unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt);
  214. const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt);
  215. const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt);
  216. MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt, MYSQL_ROW_OFFSET offset);
  217. MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt);
  218. void STDCALL mysql_stmt_data_seek(MYSQL_STMT *stmt, unsigned long long offset);
  219. unsigned long long STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt);
  220. unsigned long long STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt);
  221. unsigned long long STDCALL mysql_stmt_insert_id(MYSQL_STMT *stmt);
  222. unsigned int STDCALL mysql_stmt_field_count(MYSQL_STMT *stmt);
  223. int STDCALL mysql_stmt_next_result(MYSQL_STMT *stmt);
  224. my_bool STDCALL mysql_stmt_more_results(MYSQL_STMT *stmt);
  225. int STDCALL mariadb_stmt_execute_direct(MYSQL_STMT *stmt, const char *stmt_str, size_t length);
  226. MYSQL_FIELD * STDCALL mariadb_stmt_fetch_fields(MYSQL_STMT *stmt);