1 module utils.db.mysql.binding;
2 
3 public import
4 				core.stdc.config;
5 
6 
7 enum
8 {
9 	MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE,
10 	MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
11 	MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
12 	MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
13 	MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
14 	MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
15 	MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
16 	MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
17 	MYSQL_OPT_SSL_VERIFY_SERVER_CERT, MYSQL_PLUGIN_DIR, MYSQL_DEFAULT_AUTH,
18 	MYSQL_OPT_BIND,
19 	MYSQL_OPT_SSL_KEY, MYSQL_OPT_SSL_CERT,
20 	MYSQL_OPT_SSL_CA, MYSQL_OPT_SSL_CAPATH, MYSQL_OPT_SSL_CIPHER,
21 	MYSQL_OPT_SSL_CRL, MYSQL_OPT_SSL_CRLPATH,
22 	MYSQL_OPT_CONNECT_ATTR_RESET, MYSQL_OPT_CONNECT_ATTR_ADD,
23 	MYSQL_OPT_CONNECT_ATTR_DELETE,
24 	MYSQL_SERVER_PUBLIC_KEY,
25 	MYSQL_ENABLE_CLEARTEXT_PLUGIN,
26 	MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
27 	MYSQL_OPT_SSL_ENFORCE,
28 	MYSQL_OPT_MAX_ALLOWED_PACKET, MYSQL_OPT_NET_BUFFER_LENGTH,
29 	MYSQL_OPT_TLS_VERSION,
30 	MYSQL_OPT_SSL_MODE
31 }
32 
33 enum
34 {
35 	MYSQL_STATUS_READY, MYSQL_STATUS_GET_RESULT, MYSQL_STATUS_USE_RESULT,
36 	MYSQL_STATUS_STATEMENT_GET_RESULT
37 }
38 
39 enum
40 {
41 	MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
42 	MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
43 }
44 
45 enum
46 {
47 	SSL_MODE_DISABLED = 1, SSL_MODE_PREFERRED, SSL_MODE_REQUIRED,
48 	SSL_MODE_VERIFY_CA, SSL_MODE_VERIFY_IDENTITY
49 }
50 
51 enum
52 {
53 	MYSQL_STMT_INIT_DONE = 1,
54 	MYSQL_STMT_PREPARE_DONE,
55 	MYSQL_STMT_EXECUTE_DONE,
56 	MYSQL_STMT_FETCH_DONE
57 }
58 
59 enum
60 {
61 	STMT_ATTR_UPDATE_MAX_LENGTH,
62 	STMT_ATTR_CURSOR_TYPE,
63 	STMT_ATTR_PREFETCH_ROWS
64 }
65 
66 enum
67 {
68 	MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
69 	MYSQL_TYPE_SHORT,  MYSQL_TYPE_LONG,
70 	MYSQL_TYPE_FLOAT,  MYSQL_TYPE_DOUBLE,
71 	MYSQL_TYPE_NULL,   MYSQL_TYPE_TIMESTAMP,
72 	MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
73 	MYSQL_TYPE_DATE,   MYSQL_TYPE_TIME,
74 	MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
75 	MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
76 	MYSQL_TYPE_BIT,
77 	MYSQL_TYPE_TIMESTAMP2,
78 	MYSQL_TYPE_DATETIME2,
79 	MYSQL_TYPE_TIME2,
80 	MYSQL_TYPE_JSON = 245,
81 	MYSQL_TYPE_NEWDECIMAL = 246,
82 	MYSQL_TYPE_ENUM = 247,
83 	MYSQL_TYPE_SET = 248,
84 	MYSQL_TYPE_TINY_BLOB = 249,
85 	MYSQL_TYPE_MEDIUM_BLOB = 250,
86 	MYSQL_TYPE_LONG_BLOB = 251,
87 	MYSQL_TYPE_BLOB = 252,
88 	MYSQL_TYPE_VAR_STRING = 253,
89 	MYSQL_TYPE_STRING = 254,
90 	MYSQL_TYPE_GEOMETRY = 255
91 }
92 
93 enum
94 {
95 	MYSQL_NO_DATA = 100,
96 	MYSQL_DATA_TRUNCATED
97 }
98 
99 alias NET = void;
100 alias MYSQL = void;
101 alias MYSQL_ROW = char**;
102 alias MYSQL_FIELD_OFFSET = uint;
103 alias MYSQL_ROW_OFFSET = MYSQL_ROWS*;
104 
105 extern(System):
106 
107 struct MYSQL_FIELD
108 {
109 	char* name;
110 	char* org_name;
111 	char* table;
112 	char* org_table;
113 	char* db;
114 	char* catalog;
115 	char* def;
116 	c_ulong length;
117 	c_ulong max_length;
118 	uint name_length;
119 	uint org_name_length;
120 	uint table_length;
121 	uint org_table_length;
122 	uint db_length;
123 	uint catalog_length;
124 	uint def_length;
125 	uint flags;
126 	uint decimals;
127 	uint charsetnr;
128 	int type;
129 	void* extension;
130 }
131 
132 struct MYSQL_ROWS
133 {
134 	MYSQL_ROWS* next;
135 	MYSQL_ROW data;
136 	c_ulong length;
137 }
138 
139 struct USED_MEM
140 {
141 	USED_MEM* next;
142 	uint left;
143 	uint size;
144 }
145 
146 struct LIST
147 {
148 	LIST* prev, next;
149 	void* data;
150 }
151 
152 struct MEM_ROOT
153 {
154 	USED_MEM* free;
155 	USED_MEM* used;
156 	USED_MEM* pre_alloc;
157 	size_t min_malloc;
158 	size_t block_size;
159 	uint block_num;
160 	uint first_block_usage;
161 
162 	void function() error_handler;
163 
164 	uint m_psi_key;
165 }
166 
167 struct MYSQL_DATA
168 {
169 	MYSQL_ROWS* data;
170 	void* embedded_info;
171 	MEM_ROOT alloc;
172 	ulong rows;
173 	uint fields;
174 	void* extension;
175 }
176 
177 struct MY_CHARSET_INFO
178 {
179 	uint number;
180 	uint state;
181 	const(char)* csname;
182 	const(char)* name;
183 	const(char)* comment;
184 	const(char)* dir;
185 	uint mbminlen;
186 	uint mbmaxlen;
187 }
188 
189 struct MYSQL_RES
190 {
191 	ulong row_count;
192 	MYSQL_FIELD* fields;
193 	MYSQL_DATA* data;
194 	MYSQL_ROWS* data_cursor;
195 	c_ulong* lengths;
196 	MYSQL* handle;
197 	const(void)* methods;
198 	MYSQL_ROW row;
199 	MYSQL_ROW current_row;
200 	MEM_ROOT field_alloc;
201 	uint field_count, current_field;
202 	bool eof;
203 
204 	bool unbuffered_fetch_cancelled;
205 	void* extension;
206 }
207 
208 struct MYSQL_PARAMETERS
209 {
210 	c_ulong* p_max_allowed_packet;
211 	c_ulong* p_net_buffer_length;
212 	void* extension;
213 }
214 
215 struct MYSQL_BIND
216 {
217 	c_ulong* length;
218 	bool* is_null;
219 	void* buffer;
220 
221 	bool* error;
222 	ubyte* row_ptr;
223 
224 	void function(NET* net, MYSQL_BIND* param) store_param_func;
225 	void function(MYSQL_BIND*, MYSQL_FIELD*, ubyte** row) fetch_result;
226 	void function(MYSQL_BIND*, MYSQL_FIELD*, ubyte** row) skip_result;
227 
228 	c_ulong buffer_length;
229 	c_ulong offset;
230 	c_ulong length_value;
231 	uint param_number;
232 	uint pack_length;
233 	int buffer_type;
234 	bool error_value;
235 	bool is_unsigned;
236 	bool long_data_used;
237 	bool is_null_value;
238 	void* extension;
239 }
240 
241 struct MYSQL_STMT
242 {
243 	MEM_ROOT mem_root;
244 	LIST list;
245 	MYSQL* mysql;
246 	MYSQL_BIND* params;
247 	MYSQL_BIND* bind;
248 	MYSQL_FIELD* fields;
249 	MYSQL_DATA result;
250 	MYSQL_ROWS* data_cursor;
251 
252 	int function(MYSQL_STMT* stmt, ubyte** row) read_row_func;
253 
254 	ulong affected_rows;
255 	ulong insert_id;
256 	c_ulong	 stmt_id;
257 	c_ulong flags;
258 	c_ulong prefetch_rows;
259 
260 	uint server_status;
261 	uint last_errno;
262 	uint param_count;
263 	uint field_count;
264 	int state;
265 	char[512] last_error;
266 	char[5+1] sqlstate;
267 
268 	bool send_types_to_server;
269 	bool bind_param_done;
270 	ubyte bind_result_done;
271 
272 	bool unbuffered_fetch_cancelled;
273 	bool update_max_length;
274 	void* extension;
275 }
276 
277 bool my_init();
278 
279 MYSQL_PARAMETERS* mysql_get_parameters();
280 
281 int mysql_server_init(int argc, char** argv, char** groups);
282 void mysql_server_end();
283 
284 bool mysql_thread_init();
285 void mysql_thread_end();
286 
287 ulong mysql_num_rows(MYSQL_RES* res);
288 uint mysql_num_fields(MYSQL_RES* res);
289 bool mysql_eof(MYSQL_RES* res);
290 MYSQL_FIELD* mysql_fetch_field_direct(MYSQL_RES* res, uint fieldnr);
291 MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* res);
292 MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES* res);
293 MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES* res);
294 
295 uint mysql_field_count(MYSQL* mysql);
296 ulong mysql_affected_rows(MYSQL* mysql);
297 ulong mysql_insert_id(MYSQL* mysql);
298 uint mysql_errno(MYSQL* mysql);
299 const(char)* mysql_error(MYSQL* mysql);
300 const(char)* mysql_sqlstate(MYSQL* mysql);
301 uint mysql_warning_count(MYSQL* mysql);
302 const(char)* mysql_info(MYSQL* mysql);
303 c_ulong mysql_thread_id(MYSQL* mysql);
304 const(char)* mysql_character_set_name(MYSQL* mysql);
305 int mysql_set_character_set(MYSQL* mysql, const(char)* csname);
306 
307 MYSQL* mysql_init(MYSQL* mysql);
308 bool mysql_ssl_set(MYSQL* mysql, const(char)* key, const(char)* cert, const(char)* ca, const(char)* capath, const(char)* cipher);
309 
310 const(char)* mysql_get_ssl_cipher(MYSQL* mysql);
311 bool mysql_change_user(MYSQL* mysql, const(char)* user, const(char)* passwd, const(char)* db);
312 
313 MYSQL* mysql_real_connect(MYSQL* mysql, const(char)* host, const(char)* user, const(char)* passwd, const(char)* db, uint port, const(char)* unix_socket, c_ulong clientflag);
314 
315 int mysql_select_db(MYSQL* mysql, const(char)* db);
316 int mysql_query(MYSQL* mysql, const(char)* q);
317 int mysql_send_query(MYSQL* mysql, const(char)* q, c_ulong length);
318 int mysql_real_query(MYSQL* mysql, const(char)* q, c_ulong length);
319 MYSQL_RES* mysql_store_result(MYSQL* mysql);
320 MYSQL_RES* mysql_use_result(MYSQL* mysql);
321 
322 void mysql_get_character_set_info(MYSQL* mysql, MY_CHARSET_INFO* charset);
323 
324 int mysql_session_track_get_first(MYSQL* mysql, int type, const(char)** data, size_t* length);
325 int mysql_session_track_get_next(MYSQL* mysql, int type, const(char)** data, size_t* length);
326 
327 void mysql_set_local_infile_handler(MYSQL* mysql, int function(void**, const(char)*, void*) local_infile_init, int function(void*, char*, uint) local_infile_read, void function(void*) local_infile_end, int function(void*, char*, uint) local_infile_error, void*);
328 
329 void mysql_set_local_infile_default(MYSQL* mysql);
330 
331 int mysql_shutdown(MYSQL* mysql, int shutdown_level);
332 int mysql_dump_debug_info(MYSQL* mysql);
333 int mysql_refresh(MYSQL* mysql, uint refresh_options);
334 int mysql_kill(MYSQL* mysql, c_ulong pid);
335 int mysql_set_server_option(MYSQL* mysql, int option);
336 int mysql_ping(MYSQL* mysql);
337 const(char)* mysql_stat(MYSQL* mysql);
338 const(char)* mysql_get_server_info(MYSQL* mysql);
339 const(char)* mysql_get_client_info();
340 c_ulong mysql_get_client_version();
341 const(char)* mysql_get_host_info(MYSQL* mysql);
342 c_ulong mysql_get_server_version(MYSQL* mysql);
343 uint mysql_get_proto_info(MYSQL* mysql);
344 MYSQL_RES* mysql_list_dbs(MYSQL* mysql, const(char)* wild);
345 MYSQL_RES* mysql_list_tables(MYSQL* mysql, const(char)* wild);
346 MYSQL_RES* mysql_list_processes(MYSQL* mysql);
347 int mysql_options(MYSQL* mysql, int option, const(void)* arg);
348 int mysql_options4(MYSQL* mysql, int option, const(void)* arg1, const(void)* arg2);
349 int mysql_get_option(MYSQL* mysql, int option, const(void)* arg);
350 void mysql_free_result(MYSQL_RES* result);
351 void mysql_data_seek(MYSQL_RES* result, ulong offset);
352 MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES* result, MYSQL_ROW_OFFSET offset);
353 MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES* result, MYSQL_FIELD_OFFSET offset);
354 MYSQL_ROW mysql_fetch_row(MYSQL_RES* result);
355 c_ulong* mysql_fetch_lengths(MYSQL_RES* result);
356 MYSQL_FIELD* mysql_fetch_field(MYSQL_RES* result);
357 MYSQL_RES* mysql_list_fields(MYSQL* mysql, const(char)* table, const(char)* wild);
358 c_ulong mysql_escape_string(char* to, const(char)* from, c_ulong from_length);
359 c_ulong mysql_hex_string(char* to, const(char)* from, c_ulong from_length);
360 c_ulong mysql_real_escape_string(MYSQL* mysql, char* to, const(char)* from, c_ulong length);
361 c_ulong mysql_real_escape_string_quote(MYSQL* mysql, char* to, const(char)* from, c_ulong length, char quote);
362 void mysql_debug(const(char)* debug_);
363 void myodbc_remove_escape(MYSQL* mysql, char* name);
364 uint mysql_thread_safe();
365 bool mysql_embedded();
366 bool mysql_read_query_result(MYSQL* mysql);
367 int mysql_reset_connection(MYSQL* mysql);
368 
369 MYSQL_STMT* mysql_stmt_init(MYSQL* mysql);
370 int mysql_stmt_prepare(MYSQL_STMT* stmt, const(char)* query, c_ulong length);
371 int mysql_stmt_execute(MYSQL_STMT* stmt);
372 int mysql_stmt_fetch(MYSQL_STMT* stmt);
373 int mysql_stmt_fetch_column(MYSQL_STMT* stmt, MYSQL_BIND* bind_arg, uint column, c_ulong offset);
374 int mysql_stmt_store_result(MYSQL_STMT* stmt);
375 c_ulong mysql_stmt_param_count(MYSQL_STMT* stmt);
376 bool mysql_stmt_attr_set(MYSQL_STMT* stmt, int attr_type, const(void)* attr);
377 bool mysql_stmt_attr_get(MYSQL_STMT* stmt, int attr_type, void* attr);
378 bool mysql_stmt_bind_param(MYSQL_STMT* stmt, MYSQL_BIND* bnd);
379 bool mysql_stmt_bind_result(MYSQL_STMT* stmt, MYSQL_BIND* bnd);
380 bool mysql_stmt_close(MYSQL_STMT* stmt);
381 bool mysql_stmt_reset(MYSQL_STMT* stmt);
382 bool mysql_stmt_free_result(MYSQL_STMT* stmt);
383 bool mysql_stmt_send_long_data(MYSQL_STMT* stmt, uint param_number, const(char)* data, c_ulong length);
384 MYSQL_RES* mysql_stmt_result_metadata(MYSQL_STMT* stmt);
385 MYSQL_RES* mysql_stmt_param_metadata(MYSQL_STMT* stmt);
386 uint mysql_stmt_errno(MYSQL_STMT* stmt);
387 const(char)* mysql_stmt_error(MYSQL_STMT* stmt);
388 const(char)* mysql_stmt_sqlstate(MYSQL_STMT* stmt);
389 MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT* stmt, MYSQL_ROW_OFFSET offset);
390 MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT* stmt);
391 void mysql_stmt_data_seek(MYSQL_STMT* stmt, ulong offset);
392 ulong mysql_stmt_num_rows(MYSQL_STMT* stmt);
393 ulong mysql_stmt_affected_rows(MYSQL_STMT* stmt);
394 ulong mysql_stmt_insert_id(MYSQL_STMT* stmt);
395 uint mysql_stmt_field_count(MYSQL_STMT* stmt);
396 
397 bool mysql_commit(MYSQL* mysql);
398 bool mysql_rollback(MYSQL* mysql);
399 bool mysql_autocommit(MYSQL* mysql, bool auto_mode);
400 bool mysql_more_results(MYSQL* mysql);
401 int mysql_next_result(MYSQL* mysql);
402 int mysql_stmt_next_result(MYSQL_STMT* stmt);
403 void mysql_close(MYSQL* sock);