Merge lp:~brianaker/libdrizzle/non-block-fix into lp:libdrizzle
- non-block-fix
- Merge into libdrizzle-redux
Proposed by
Brian Aker
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Andrew Hutchings | ||||
Approved revision: | 73 | ||||
Merged at revision: | 73 | ||||
Proposed branch: | lp:~brianaker/libdrizzle/non-block-fix | ||||
Merge into: | lp:libdrizzle | ||||
Diff against target: |
1377 lines (+515/-367) 20 files modified
libdrizzle-5.1/constants.h (+2/-1) libdrizzle-5.1/drizzle.h (+8/-0) libdrizzle-5.1/error.h (+1/-1) libdrizzle-5.1/include.am (+0/-1) libdrizzle-5.1/structs.h (+0/-17) libdrizzle/common.h (+6/-6) libdrizzle/conn.cc (+245/-179) libdrizzle/datetime.h (+52/-0) libdrizzle/drizzle.cc (+6/-7) libdrizzle/include.am (+2/-0) libdrizzle/pack.h (+3/-10) libdrizzle/structs.h (+5/-0) tests/unit/binlog.c (+12/-8) tests/unit/column.c (+24/-10) tests/unit/connect.c (+14/-15) tests/unit/insert_id.c (+21/-5) tests/unit/query.c (+27/-22) tests/unit/row.c (+27/-22) tests/unit/statement.c (+33/-41) tests/unit/unbuffered_query.c (+27/-22) |
||||
To merge this branch: | bzr merge lp:~brianaker/libdrizzle/non-block-fix | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Andrew Hutchings | Approve | ||
Review via email: mp+141474@code.launchpad.net |
Commit message
Description of the change
This updates more of the tests to yatl lite. If MySQL or Drizzle are available it will use them.
This also solves many corner cases around NON Block. We still hit recv() too often.
pack functions and the datetime structure are now private.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'libdrizzle-5.1/constants.h' |
2 | --- libdrizzle-5.1/constants.h 2012-12-29 21:44:53 +0000 |
3 | +++ libdrizzle-5.1/constants.h 2012-12-30 02:26:20 +0000 |
4 | @@ -61,8 +61,10 @@ |
5 | #define DRIZZLE_DEFAULT_TCP_HOST "localhost" |
6 | #define DRIZZLE_DEFAULT_TCP_PORT 3306 |
7 | #define DRIZZLE_MYSQL_TCP_PORT 3306 |
8 | +#define DRIZZLE_MYSQL_TCP_SERVICE "mysql" |
9 | #define DRIZZLE_DRIZZLE_TCP_PORT 4427 |
10 | #define DRIZZLE_DEFAULT_TCP_SERVICE "mysql" |
11 | +#define DRIZZLE_DRIZZLE_TCP_SERVICE "drizzle" |
12 | #define DRIZZLE_DEFAULT_UDS "/tmp/mysql.sock" |
13 | #define DRIZZLE_DEFAULT_BACKLOG 64 |
14 | #define DRIZZLE_MAX_ERROR_SIZE 2048 |
15 | @@ -594,7 +596,6 @@ |
16 | typedef struct drizzle_binlog_st drizzle_binlog_st; |
17 | typedef struct drizzle_stmt_st drizzle_stmt_st; |
18 | typedef struct drizzle_bind_st drizzle_bind_st; |
19 | -typedef struct drizzle_datetime_st drizzle_datetime_st; |
20 | typedef char *drizzle_field_t; |
21 | typedef drizzle_field_t *drizzle_row_t; |
22 | |
23 | |
24 | === modified file 'libdrizzle-5.1/drizzle.h' |
25 | --- libdrizzle-5.1/drizzle.h 2012-12-24 10:20:04 +0000 |
26 | +++ libdrizzle-5.1/drizzle.h 2012-12-30 02:26:20 +0000 |
27 | @@ -256,6 +256,14 @@ |
28 | |
29 | /** @} */ |
30 | |
31 | +#include <stdio.h> |
32 | +static inline void drizzle_stderr_logger(const char *line, drizzle_verbose_t verbose, void *context) |
33 | +{ |
34 | + (void)context; |
35 | + fprintf(stderr, "__LOG: %s: %s\n", drizzle_verbose_name(verbose), line); |
36 | +} |
37 | + |
38 | + |
39 | #ifdef __cplusplus |
40 | } |
41 | #endif |
42 | |
43 | === modified file 'libdrizzle-5.1/error.h' |
44 | --- libdrizzle-5.1/error.h 2012-12-18 11:36:28 +0000 |
45 | +++ libdrizzle-5.1/error.h 2012-12-30 02:26:20 +0000 |
46 | @@ -1,7 +1,7 @@ |
47 | /* |
48 | * Drizzle Client & Protocol Library |
49 | * |
50 | - * Copyright (C) 2012 Brian Aker (brian@tangent.org) |
51 | + * Copyright (C) 2012 Drizzle Developer Group |
52 | * All rights reserved. |
53 | * |
54 | * Redistribution and use in source and binary forms, with or without |
55 | |
56 | === modified file 'libdrizzle-5.1/include.am' |
57 | --- libdrizzle-5.1/include.am 2012-12-24 10:20:04 +0000 |
58 | +++ libdrizzle-5.1/include.am 2012-12-30 02:26:20 +0000 |
59 | @@ -15,7 +15,6 @@ |
60 | nobase_include_HEADERS+= libdrizzle-5.1/field_client.h |
61 | nobase_include_HEADERS+= libdrizzle-5.1/handshake_client.h |
62 | nobase_include_HEADERS+= libdrizzle-5.1/libdrizzle.h |
63 | -nobase_include_HEADERS+= libdrizzle-5.1/pack.h |
64 | nobase_include_HEADERS+= libdrizzle-5.1/query.h |
65 | nobase_include_HEADERS+= libdrizzle-5.1/result.h |
66 | nobase_include_HEADERS+= libdrizzle-5.1/result_client.h |
67 | |
68 | === modified file 'libdrizzle-5.1/structs.h' |
69 | --- libdrizzle-5.1/structs.h 2012-12-23 01:05:57 +0000 |
70 | +++ libdrizzle-5.1/structs.h 2012-12-30 02:26:20 +0000 |
71 | @@ -47,21 +47,4 @@ |
72 | struct drizzle_column_st; |
73 | struct drizzle_stmt_st; |
74 | struct drizzle_bind_st; |
75 | -struct drizzle_datetime_st; |
76 | #endif |
77 | - |
78 | -/* These types may seem strange but they are defined this way in the MySQL |
79 | - * * protocol |
80 | - * */ |
81 | -struct drizzle_datetime_st |
82 | -{ |
83 | - uint16_t year; |
84 | - uint8_t month; |
85 | - uint32_t day; |
86 | - uint16_t hour; |
87 | - uint8_t minute; |
88 | - uint8_t second; |
89 | - uint32_t microsecond; |
90 | - bool negative; |
91 | -}; |
92 | - |
93 | |
94 | === modified file 'libdrizzle/common.h' |
95 | --- libdrizzle/common.h 2012-12-24 10:20:04 +0000 |
96 | +++ libdrizzle/common.h 2012-12-30 02:26:20 +0000 |
97 | @@ -62,11 +62,11 @@ |
98 | #include <string.h> |
99 | #include <signal.h> |
100 | |
101 | -#include <libdrizzle/structs.h> |
102 | -#include <libdrizzle/drizzle_local.h> |
103 | -#include <libdrizzle/conn_local.h> |
104 | -#include <libdrizzle-5.1/pack.h> |
105 | -#include <libdrizzle/state.h> |
106 | -#include <libdrizzle/sha1.h> |
107 | +#include "libdrizzle/structs.h" |
108 | +#include "libdrizzle/drizzle_local.h" |
109 | +#include "libdrizzle/conn_local.h" |
110 | +#include "libdrizzle/pack.h" |
111 | +#include "libdrizzle/state.h" |
112 | +#include "libdrizzle/sha1.h" |
113 | |
114 | #include <memory.h> |
115 | |
116 | === modified file 'libdrizzle/conn.cc' |
117 | --- libdrizzle/conn.cc 2012-12-22 13:07:06 +0000 |
118 | +++ libdrizzle/conn.cc 2012-12-30 02:26:20 +0000 |
119 | @@ -63,19 +63,41 @@ |
120 | */ |
121 | static drizzle_return_t _setsockopt(drizzle_st *con); |
122 | |
123 | +static void __closesocket(int& fd) |
124 | +{ |
125 | + if (fd != -1) |
126 | + { |
127 | + (void)shutdown(fd, SHUT_RDWR); |
128 | + (void)closesocket(fd); |
129 | + fd= -1; |
130 | + } |
131 | +} |
132 | + |
133 | static bool connect_poll(drizzle_st *con) |
134 | { |
135 | struct pollfd fds[1]; |
136 | fds[0].fd= con->fd; |
137 | - fds[0].events= POLLOUT; |
138 | + fds[0].events= POLLIN; |
139 | |
140 | - size_t loop_max= 5; |
141 | + size_t loop_max= 5; // This should only be used for EINTR |
142 | while (--loop_max) // Should only loop on cases of ERESTART or EINTR |
143 | { |
144 | int error= poll(fds, 1, con->timeout); |
145 | - switch (error) |
146 | + if (error == 1) |
147 | { |
148 | - case 1: |
149 | + if (fds[0].revents & (POLLIN)) |
150 | + { |
151 | + drizzle_log_crazy(con, "poll(POLLIN)"); |
152 | + return true; |
153 | + } |
154 | + |
155 | + if (fds[0].revents & (POLLOUT)) |
156 | + { |
157 | + drizzle_log_crazy(con, "poll(POLLOUT)"); |
158 | + return true; |
159 | + } |
160 | + |
161 | + if (fds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) |
162 | { |
163 | int err; |
164 | socklen_t len= sizeof (err); |
165 | @@ -89,53 +111,48 @@ |
166 | return true; |
167 | } |
168 | errno= err; |
169 | + perror("poll()"); |
170 | } |
171 | |
172 | // "getsockopt() failed" |
173 | return false; |
174 | } |
175 | |
176 | - case 0: |
177 | - { |
178 | - // "timeout occurred while trying to connect" |
179 | - return false; |
180 | - } |
181 | - |
182 | - default: // A real error occurred and we need to completely bail |
183 | - switch (get_socket_errno()) |
184 | - { |
185 | + assert(0); |
186 | + |
187 | + return false; |
188 | + } |
189 | + else if (error == 0) |
190 | + { |
191 | + // "timeout occurred while trying to connect" |
192 | + drizzle_log_crazy(con, "poll(TIMEOUT) %d", con->timeout); |
193 | + return false; |
194 | + } |
195 | + |
196 | + perror("poll2()"); |
197 | + switch (get_socket_errno()) |
198 | + { |
199 | #ifdef TARGET_OS_LINUX |
200 | - case ERESTART: |
201 | + case ERESTART: |
202 | #endif |
203 | - case EINTR: |
204 | - continue; |
205 | - |
206 | - case EFAULT: |
207 | - case ENOMEM: |
208 | - // "poll() failure" |
209 | - return false; |
210 | - |
211 | - case EINVAL: |
212 | - // "RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid" |
213 | - return false; |
214 | - |
215 | - default: // This should not happen |
216 | - if (fds[0].revents & POLLERR) |
217 | - { |
218 | - int err; |
219 | - socklen_t len= sizeof (err); |
220 | - (void)getsockopt(con->fd, SOL_SOCKET, SO_ERROR, &err, &len); |
221 | - errno= err; |
222 | - } |
223 | - else |
224 | - { |
225 | - errno= get_socket_errno(); |
226 | - } |
227 | - |
228 | - //"socket error occurred"); |
229 | - return false; |
230 | - } |
231 | + case EINTR: |
232 | + continue; |
233 | + |
234 | + case EFAULT: |
235 | + case ENOMEM: |
236 | + // "poll() failure" |
237 | + break; |
238 | + |
239 | + case EINVAL: |
240 | + // "RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid" |
241 | + break; |
242 | + |
243 | + default: |
244 | + break; |
245 | } |
246 | + |
247 | + //"socket error occurred"); |
248 | + return false; |
249 | } |
250 | |
251 | // This should only be possible from ERESTART or EINTR; |
252 | @@ -171,8 +188,7 @@ |
253 | return; |
254 | } |
255 | |
256 | - (void)closesocket(con->fd); |
257 | - con->fd= -1; |
258 | + __closesocket(con->fd); |
259 | |
260 | con->options = (drizzle_options_t)((int)con->options & (int)~DRIZZLE_CON_READY); |
261 | con->packet_number= 0; |
262 | @@ -585,13 +601,25 @@ |
263 | |
264 | drizzle_return_t drizzle_quit(drizzle_st *con) |
265 | { |
266 | - drizzle_return_t ret; |
267 | - drizzle_result_st *result; |
268 | - result= drizzle_command_write(con, NULL, DRIZZLE_COMMAND_QUIT, NULL, 0, |
269 | - 0, &ret); |
270 | - drizzle_result_free(result); |
271 | - drizzle_free(con); |
272 | - return ret; |
273 | + if (con) |
274 | + { |
275 | + drizzle_log_crazy(con, "shutting down the connection"); |
276 | + con->flags.is_shutdown= true; |
277 | + drizzle_return_t ret; |
278 | + drizzle_result_st *result; |
279 | + result= drizzle_command_write(con, NULL, DRIZZLE_COMMAND_QUIT, NULL, 0, 0, &ret); |
280 | + drizzle_result_free(result); |
281 | + drizzle_free(con); |
282 | + |
283 | + if (ret == DRIZZLE_RETURN_LOST_CONNECTION) |
284 | + { |
285 | + return DRIZZLE_RETURN_OK; |
286 | + } |
287 | + |
288 | + return ret; |
289 | + } |
290 | + |
291 | + return DRIZZLE_RETURN_INVALID_ARGUMENT; |
292 | } |
293 | |
294 | drizzle_result_st *drizzle_select_db(drizzle_st *con, |
295 | @@ -774,7 +802,6 @@ |
296 | const char *host; |
297 | char port[NI_MAXSERV]; |
298 | struct addrinfo ai; |
299 | - int ret; |
300 | |
301 | if (con == NULL) |
302 | { |
303 | @@ -786,47 +813,49 @@ |
304 | switch (con->socket_type) |
305 | { |
306 | case DRIZZLE_CON_SOCKET_TCP: |
307 | - tcp= &(con->socket.tcp); |
308 | - |
309 | - if (tcp->addrinfo != NULL) |
310 | - { |
311 | - freeaddrinfo(tcp->addrinfo); |
312 | - tcp->addrinfo= NULL; |
313 | - } |
314 | - |
315 | - if (tcp->port != 0) |
316 | - { |
317 | - snprintf(port, NI_MAXSERV, "%u", tcp->port); |
318 | - } |
319 | - else |
320 | - { |
321 | - snprintf(port, NI_MAXSERV, "%u", DRIZZLE_DEFAULT_TCP_PORT); |
322 | - } |
323 | - port[NI_MAXSERV-1]= 0; |
324 | - |
325 | - memset(&ai, 0, sizeof(struct addrinfo)); |
326 | - ai.ai_socktype= SOCK_STREAM; |
327 | - ai.ai_protocol= IPPROTO_TCP; |
328 | - ai.ai_flags = AI_PASSIVE; |
329 | - ai.ai_family = AF_UNSPEC; |
330 | - |
331 | - if (tcp->host == NULL) |
332 | - { |
333 | - host= DRIZZLE_DEFAULT_TCP_HOST; |
334 | - } |
335 | - else |
336 | - { |
337 | - host= tcp->host; |
338 | - } |
339 | - |
340 | - ret= getaddrinfo(host, port, &ai, &(tcp->addrinfo)); |
341 | - if (ret != 0) |
342 | - { |
343 | - drizzle_set_error(con, "drizzle_state_addrinfo", "getaddrinfo:%s", gai_strerror(ret)); |
344 | - return DRIZZLE_RETURN_GETADDRINFO; |
345 | - } |
346 | - |
347 | - con->addrinfo_next= tcp->addrinfo; |
348 | + { |
349 | + tcp= &(con->socket.tcp); |
350 | + |
351 | + if (tcp->addrinfo != NULL) |
352 | + { |
353 | + freeaddrinfo(tcp->addrinfo); |
354 | + tcp->addrinfo= NULL; |
355 | + } |
356 | + |
357 | + if (tcp->port != 0) |
358 | + { |
359 | + snprintf(port, NI_MAXSERV, "%u", tcp->port); |
360 | + } |
361 | + else |
362 | + { |
363 | + snprintf(port, NI_MAXSERV, "%u", DRIZZLE_DEFAULT_TCP_PORT); |
364 | + } |
365 | + port[NI_MAXSERV-1]= 0; |
366 | + |
367 | + memset(&ai, 0, sizeof(struct addrinfo)); |
368 | + ai.ai_socktype= SOCK_STREAM; |
369 | + ai.ai_protocol= IPPROTO_TCP; |
370 | + ai.ai_family= AF_UNSPEC; |
371 | + |
372 | + if (tcp->host == NULL) |
373 | + { |
374 | + host= DRIZZLE_DEFAULT_TCP_HOST; |
375 | + } |
376 | + else |
377 | + { |
378 | + host= tcp->host; |
379 | + } |
380 | + |
381 | + drizzle_log_crazy(con, "host=%s port=%s", host, port); |
382 | + int ret= getaddrinfo(host, port, &ai, &(tcp->addrinfo)); |
383 | + if (ret != 0) |
384 | + { |
385 | + drizzle_set_error(con, "drizzle_state_addrinfo", "getaddrinfo:%s", gai_strerror(ret)); |
386 | + return DRIZZLE_RETURN_GETADDRINFO; |
387 | + } |
388 | + |
389 | + con->addrinfo_next= tcp->addrinfo; |
390 | + } |
391 | |
392 | break; |
393 | |
394 | @@ -850,11 +879,7 @@ |
395 | |
396 | drizzle_log_debug(con, "drizzle_state_connect"); |
397 | |
398 | - if (con->fd != -1) |
399 | - { |
400 | - (void)closesocket(con->fd); |
401 | - con->fd= -1; |
402 | - } |
403 | + __closesocket(con->fd); |
404 | |
405 | if (con->socket_type == DRIZZLE_CON_SOCKET_UDS) |
406 | { |
407 | @@ -927,9 +952,7 @@ |
408 | |
409 | while (1) |
410 | { |
411 | - int ret; |
412 | - ret= connect(con->fd, con->addrinfo_next->ai_addr, |
413 | - con->addrinfo_next->ai_addrlen); |
414 | + int ret= connect(con->fd, con->addrinfo_next->ai_addr, con->addrinfo_next->ai_addrlen); |
415 | |
416 | #ifdef _WIN32 |
417 | errno = WSAGetLastError(); |
418 | @@ -1080,7 +1103,9 @@ |
419 | drizzle_log_debug(con, "drizzle_state_read"); |
420 | |
421 | if (con->buffer_size == 0) |
422 | + { |
423 | con->buffer_ptr= con->buffer; |
424 | + } |
425 | else if ((con->buffer_ptr - con->buffer) > (DRIZZLE_MAX_BUFFER_SIZE / 2)) |
426 | { |
427 | memmove(con->buffer, con->buffer_ptr, con->buffer_size); |
428 | @@ -1095,107 +1120,144 @@ |
429 | * returns EAGAIN. This improves performance. */ |
430 | ret= drizzle_set_events(con, POLLIN); |
431 | if (ret != DRIZZLE_RETURN_OK) |
432 | + { |
433 | return ret; |
434 | + } |
435 | + |
436 | return DRIZZLE_RETURN_IO_WAIT; |
437 | } |
438 | |
439 | while (1) |
440 | { |
441 | - size_t available_buffer= (size_t)DRIZZLE_MAX_BUFFER_SIZE - |
442 | - ((size_t)(con->buffer_ptr - con->buffer) + con->buffer_size); |
443 | + size_t available_buffer= (size_t)DRIZZLE_MAX_BUFFER_SIZE - ((size_t)(con->buffer_ptr - con->buffer) + con->buffer_size); |
444 | + |
445 | #ifdef USE_OPENSSL |
446 | if (con->ssl_state == DRIZZLE_SSL_STATE_HANDSHAKE_COMPLETE) |
447 | + { |
448 | read_size= SSL_read(con->ssl, (char*)con->buffer_ptr + con->buffer_size, available_buffer); |
449 | + } |
450 | else |
451 | #endif |
452 | + { |
453 | read_size= recv(con->fd, (char *)con->buffer_ptr + con->buffer_size, available_buffer, MSG_NOSIGNAL); |
454 | + } |
455 | #ifdef _WIN32 |
456 | - errno = WSAGetLastError(); |
457 | - switch(errno) { |
458 | - case WSAENOTCONN: |
459 | - case WSAEWOULDBLOCK: |
460 | - errno= EAGAIN; |
461 | - break; |
462 | - case WSAEINVAL: |
463 | - case WSAEALREADY: |
464 | - errno= EINPROGRESS; |
465 | - break; |
466 | - case WSAECONNREFUSED: |
467 | - errno= ECONNREFUSED; |
468 | - break; |
469 | - case WSAENETUNREACH: |
470 | - errno= ENETUNREACH; |
471 | - break; |
472 | - case WSAETIMEDOUT: |
473 | - errno= ETIMEDOUT; |
474 | - break; |
475 | - case WSAECONNRESET: |
476 | - errno= ECONNRESET; |
477 | - break; |
478 | - case WSAEADDRINUSE: |
479 | - errno= EADDRINUSE; |
480 | - break; |
481 | - case WSAEOPNOTSUPP: |
482 | - errno= EOPNOTSUPP; |
483 | - break; |
484 | - case WSAENOPROTOOPT: |
485 | - errno= ENOPROTOOPT; |
486 | - break; |
487 | - default: |
488 | - break; |
489 | + if (_WIN32) |
490 | + { |
491 | + errno= WSAGetLastError(); |
492 | + switch (errno) |
493 | + { |
494 | + case WSAENOTCONN: |
495 | + case WSAEWOULDBLOCK: |
496 | + errno= EAGAIN; |
497 | + break; |
498 | + case WSAEINVAL: |
499 | + case WSAEALREADY: |
500 | + errno= EINPROGRESS; |
501 | + break; |
502 | + case WSAECONNREFUSED: |
503 | + errno= ECONNREFUSED; |
504 | + break; |
505 | + case WSAENETUNREACH: |
506 | + errno= ENETUNREACH; |
507 | + break; |
508 | + case WSAETIMEDOUT: |
509 | + errno= ETIMEDOUT; |
510 | + break; |
511 | + case WSAECONNRESET: |
512 | + errno= ECONNRESET; |
513 | + break; |
514 | + case WSAEADDRINUSE: |
515 | + errno= EADDRINUSE; |
516 | + break; |
517 | + case WSAEOPNOTSUPP: |
518 | + errno= EOPNOTSUPP; |
519 | + break; |
520 | + case WSAENOPROTOOPT: |
521 | + errno= ENOPROTOOPT; |
522 | + break; |
523 | + default: |
524 | + break; |
525 | + } |
526 | } |
527 | #endif /* _WIN32 */ |
528 | - drizzle_log_crazy(con, "read fd=%d return=%zd ssl= %d errno=%s", |
529 | + |
530 | + drizzle_log_crazy(con, "read fd=%d recv=%zd ssl= %d errno=%s", |
531 | con->fd, read_size, |
532 | (con->ssl_state == DRIZZLE_SSL_STATE_HANDSHAKE_COMPLETE) ? 1 : 0, |
533 | strerror(errno)); |
534 | |
535 | if (read_size == 0) |
536 | { |
537 | - drizzle_set_error(con, __func__, |
538 | - "%s:%d lost connection to server (EOF)", __FILE__, __LINE__); |
539 | + if (con->flags.is_shutdown == false) |
540 | + { |
541 | + drizzle_set_error(con, __func__, |
542 | + "%s:%d lost connection to server (EOF)", __FILE__, __LINE__); |
543 | + } |
544 | + |
545 | return DRIZZLE_RETURN_LOST_CONNECTION; |
546 | } |
547 | else if (read_size == -1) |
548 | { |
549 | - if (errno == EAGAIN) |
550 | - { |
551 | - /* clear the read ready flag */ |
552 | - con->revents&= ~POLLIN; |
553 | - ret= drizzle_set_events(con, POLLIN); |
554 | - if (ret != DRIZZLE_RETURN_OK) |
555 | - return ret; |
556 | - |
557 | - if (con->options & DRIZZLE_CON_OPTIONS_NON_BLOCKING) |
558 | - return DRIZZLE_RETURN_IO_WAIT; |
559 | - |
560 | - ret= drizzle_wait(con); |
561 | - if (ret != DRIZZLE_RETURN_OK) |
562 | - return ret; |
563 | - |
564 | - continue; |
565 | - } |
566 | - else if (errno == ECONNREFUSED) |
567 | - { |
568 | - con->revents= 0; |
569 | - drizzle_state_pop(con); |
570 | - drizzle_state_push(con, drizzle_state_connect); |
571 | - con->addrinfo_next= con->addrinfo_next->ai_next; |
572 | - return DRIZZLE_RETURN_OK; |
573 | - } |
574 | - else if (errno == EINTR) |
575 | - { |
576 | - continue; |
577 | - } |
578 | - else if (errno == EPIPE || errno == ECONNRESET) |
579 | - { |
580 | - drizzle_set_error(con, __func__, |
581 | - "%s:%d lost connection to server (%s)", |
582 | - __FILE__, __LINE__, strerror(errno)); |
583 | - return DRIZZLE_RETURN_LOST_CONNECTION; |
584 | - } |
585 | - |
586 | - drizzle_set_error(con, __func__, "read:%s", strerror(errno)); |
587 | + // switch (get_socket_errno()) |
588 | + switch (errno) |
589 | + { |
590 | + case EAGAIN: |
591 | +#if EWOULDBLOCK != EAGAIN |
592 | + case EWOULDBLOCK: |
593 | +#endif |
594 | + { |
595 | + /* clear the read ready flag */ |
596 | + con->revents&= ~POLLIN; |
597 | + ret= drizzle_set_events(con, POLLIN); |
598 | + if (ret != DRIZZLE_RETURN_OK) |
599 | + { |
600 | + return ret; |
601 | + } |
602 | + |
603 | + if (con->options & DRIZZLE_CON_OPTIONS_NON_BLOCKING) |
604 | + { |
605 | + return DRIZZLE_RETURN_IO_WAIT; |
606 | + } |
607 | + |
608 | + ret= drizzle_wait(con); |
609 | + if (ret != DRIZZLE_RETURN_OK) |
610 | + { |
611 | + return ret; |
612 | + } |
613 | + |
614 | + continue; |
615 | + } |
616 | + case ECONNREFUSED: |
617 | + { |
618 | + con->revents= 0; |
619 | + drizzle_state_pop(con); |
620 | + drizzle_state_push(con, drizzle_state_connect); |
621 | + con->addrinfo_next= con->addrinfo_next->ai_next; |
622 | + return DRIZZLE_RETURN_OK; |
623 | + } |
624 | + |
625 | + case EINTR: |
626 | + continue; |
627 | + |
628 | + case EINVAL: |
629 | + { |
630 | + drizzle_log_crazy(con, "EINVAL fd=%d buffer=%p available_buffer=%zd", |
631 | + con->fd, (char *)con->buffer_ptr + con->buffer_size, available_buffer); |
632 | + } |
633 | + break; |
634 | + |
635 | + case EPIPE: |
636 | + case ECONNRESET: |
637 | + { |
638 | + drizzle_set_error(con, __func__, |
639 | + "%s:%d lost connection to server (%s)", |
640 | + __FILE__, __LINE__, strerror(errno)); |
641 | + return DRIZZLE_RETURN_LOST_CONNECTION; |
642 | + } |
643 | + } |
644 | + |
645 | + drizzle_set_error(con, __func__, "recv:%s", strerror(errno)); |
646 | con->last_errno= errno; |
647 | return DRIZZLE_RETURN_ERRNO; |
648 | } |
649 | @@ -1230,10 +1292,14 @@ |
650 | { |
651 | #ifdef USE_OPENSSL |
652 | if (con->ssl_state == DRIZZLE_SSL_STATE_HANDSHAKE_COMPLETE) |
653 | + { |
654 | write_size= SSL_write(con->ssl, con->buffer_ptr, con->buffer_size); |
655 | + } |
656 | else |
657 | #endif |
658 | - write_size = send(con->fd,(char *) con->buffer_ptr, con->buffer_size, MSG_NOSIGNAL); |
659 | + { |
660 | + write_size= send(con->fd,(char *) con->buffer_ptr, con->buffer_size, MSG_NOSIGNAL); |
661 | + } |
662 | |
663 | #ifdef _WIN32 |
664 | errno = WSAGetLastError(); |
665 | @@ -1313,7 +1379,7 @@ |
666 | return DRIZZLE_RETURN_LOST_CONNECTION; |
667 | } |
668 | |
669 | - drizzle_set_error(con, "drizzle_state_write", "write:%s", strerror(errno)); |
670 | + drizzle_set_error(con, "drizzle_state_write", "send: %s", strerror(errno)); |
671 | con->last_errno= errno; |
672 | return DRIZZLE_RETURN_ERRNO; |
673 | } |
674 | |
675 | === added file 'libdrizzle/datetime.h' |
676 | --- libdrizzle/datetime.h 1970-01-01 00:00:00 +0000 |
677 | +++ libdrizzle/datetime.h 2012-12-30 02:26:20 +0000 |
678 | @@ -0,0 +1,52 @@ |
679 | +/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: |
680 | + * |
681 | + * Drizzle Client & Protocol Library |
682 | + * |
683 | + * Copyright (C) 2012 Drizzle Developer Group |
684 | + * All rights reserved. |
685 | + * |
686 | + * Redistribution and use in source and binary forms, with or without |
687 | + * modification, are permitted provided that the following conditions are |
688 | + * met: |
689 | + * |
690 | + * * Redistributions of source code must retain the above copyright |
691 | + * notice, this list of conditions and the following disclaimer. |
692 | + * |
693 | + * * Redistributions in binary form must reproduce the above |
694 | + * copyright notice, this list of conditions and the following disclaimer |
695 | + * in the documentation and/or other materials provided with the |
696 | + * distribution. |
697 | + * |
698 | + * * The names of its contributors may not be used to endorse or |
699 | + * promote products derived from this software without specific prior |
700 | + * written permission. |
701 | + * |
702 | + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
703 | + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
704 | + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
705 | + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
706 | + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
707 | + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
708 | + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
709 | + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
710 | + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
711 | + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
712 | + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
713 | + * |
714 | + */ |
715 | + |
716 | +#pragma once |
717 | + |
718 | +struct drizzle_datetime_st |
719 | +{ |
720 | + uint16_t year; |
721 | + uint8_t month; |
722 | + uint32_t day; |
723 | + uint16_t hour; |
724 | + uint8_t minute; |
725 | + uint8_t second; |
726 | + uint32_t microsecond; |
727 | + bool negative; |
728 | +}; |
729 | + |
730 | + |
731 | |
732 | === modified file 'libdrizzle/drizzle.cc' |
733 | --- libdrizzle/drizzle.cc 2012-12-22 13:07:06 +0000 |
734 | +++ libdrizzle/drizzle.cc 2012-12-30 02:26:20 +0000 |
735 | @@ -174,6 +174,7 @@ |
736 | return NULL; |
737 | } |
738 | |
739 | + con->flags.is_shutdown= false; |
740 | con->options= DRIZZLE_CON_NONE; |
741 | con->packet_number= 0; |
742 | con->protocol_version= 0; |
743 | @@ -331,13 +332,11 @@ |
744 | */ |
745 | |
746 | drizzle_st *drizzle_create_tcp(const char *host, in_port_t port, |
747 | - const char *user, const char *password, |
748 | - const char *db, |
749 | - drizzle_options_t options) |
750 | + const char *user, const char *password, |
751 | + const char *db, |
752 | + drizzle_options_t options) |
753 | { |
754 | - drizzle_st *con; |
755 | - |
756 | - con= drizzle_create(); |
757 | + drizzle_st *con= drizzle_create(); |
758 | if (con == NULL) |
759 | { |
760 | return NULL; |
761 | @@ -376,7 +375,7 @@ |
762 | */ |
763 | |
764 | void drizzle_set_error(drizzle_st *con, const char *function, |
765 | - const char *format, ...) |
766 | + const char *format, ...) |
767 | { |
768 | if (con == NULL) |
769 | { |
770 | |
771 | === modified file 'libdrizzle/include.am' |
772 | --- libdrizzle/include.am 2012-12-29 17:31:57 +0000 |
773 | +++ libdrizzle/include.am 2012-12-30 02:26:20 +0000 |
774 | @@ -5,9 +5,11 @@ |
775 | noinst_HEADERS+= libdrizzle/common.h |
776 | noinst_HEADERS+= libdrizzle/conn_local.h |
777 | noinst_HEADERS+= libdrizzle/drizzle_local.h |
778 | +noinst_HEADERS+= libdrizzle/pack.h |
779 | noinst_HEADERS+= libdrizzle/sha1.h |
780 | noinst_HEADERS+= libdrizzle/state.h |
781 | noinst_HEADERS+= libdrizzle/structs.h |
782 | +noinst_HEADERS+= libdrizzle/datetime.h |
783 | |
784 | lib_LTLIBRARIES+= libdrizzle/libdrizzle.la |
785 | libdrizzle_libdrizzle_la_SOURCES= |
786 | |
787 | === renamed file 'libdrizzle-5.1/pack.h' => 'libdrizzle/pack.h' |
788 | --- libdrizzle-5.1/pack.h 2012-12-23 01:05:57 +0000 |
789 | +++ libdrizzle/pack.h 2012-12-30 02:26:20 +0000 |
790 | @@ -57,47 +57,40 @@ |
791 | /** |
792 | * Pack length-encoded number. |
793 | */ |
794 | -DRIZZLE_API |
795 | + |
796 | uint8_t *drizzle_pack_length(uint64_t number, uint8_t *ptr); |
797 | |
798 | /** |
799 | * Unpack length-encoded number. |
800 | */ |
801 | -DRIZZLE_API |
802 | + |
803 | uint64_t drizzle_unpack_length(drizzle_st *con, drizzle_return_t *ret_ptr); |
804 | |
805 | /** |
806 | * Pack length-encoded string. |
807 | */ |
808 | -DRIZZLE_API |
809 | + |
810 | uint8_t *drizzle_pack_string(char *string, uint8_t *ptr); |
811 | |
812 | -DRIZZLE_API |
813 | uint8_t *drizzle_pack_binary(uint8_t *data, size_t len, uint8_t *ptr); |
814 | |
815 | -DRIZZLE_API |
816 | uint8_t *drizzle_pack_time(drizzle_datetime_st *time, uint8_t *ptr); |
817 | |
818 | -DRIZZLE_API |
819 | uint8_t *drizzle_pack_datetime(drizzle_datetime_st *datetime, uint8_t *ptr); |
820 | |
821 | -DRIZZLE_API |
822 | void drizzle_unpack_time(drizzle_field_t field, size_t length, uint8_t *data); |
823 | |
824 | -DRIZZLE_API |
825 | void drizzle_unpack_datetime(drizzle_field_t field, size_t length, uint8_t *data); |
826 | |
827 | /** |
828 | * Unpack length-encoded string. |
829 | */ |
830 | -DRIZZLE_API |
831 | drizzle_return_t drizzle_unpack_string(drizzle_st *con, char *buffer, |
832 | uint64_t max_size); |
833 | |
834 | /** |
835 | * Pack user, scramble, and db. |
836 | */ |
837 | -DRIZZLE_API |
838 | uint8_t *drizzle_pack_auth(drizzle_st *con, uint8_t *ptr, |
839 | drizzle_return_t *ret_ptr); |
840 | |
841 | |
842 | === modified file 'libdrizzle/structs.h' |
843 | --- libdrizzle/structs.h 2012-12-29 21:44:53 +0000 |
844 | +++ libdrizzle/structs.h 2012-12-30 02:26:20 +0000 |
845 | @@ -60,6 +60,8 @@ |
846 | extern "C" { |
847 | #endif |
848 | |
849 | +#include "libdrizzle/datetime.h" |
850 | + |
851 | /** |
852 | * @ingroup drizzle_command |
853 | * Commands for drizzle_command functions. |
854 | @@ -139,6 +141,9 @@ |
855 | */ |
856 | struct drizzle_st |
857 | { |
858 | + struct { |
859 | + bool is_shutdown; |
860 | + } flags; |
861 | uint8_t packet_number; |
862 | uint8_t protocol_version; |
863 | uint8_t state_current; |
864 | |
865 | === modified file 'tests/unit/binlog.c' |
866 | --- tests/unit/binlog.c 2012-12-29 11:43:03 +0000 |
867 | +++ tests/unit/binlog.c 2012-12-30 02:26:20 +0000 |
868 | @@ -48,20 +48,23 @@ |
869 | { |
870 | (void) argc; |
871 | (void) argv; |
872 | - drizzle_result_st *result; |
873 | |
874 | - drizzle_st *con= drizzle_create_tcp("localhost", 3306, "root", "", "", 0); |
875 | + drizzle_st *con= drizzle_create_tcp("localhost", DRIZZLE_DEFAULT_TCP_PORT, "root", NULL, NULL, 0); |
876 | ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); |
877 | |
878 | - drizzle_return_t ret = drizzle_connect(con); |
879 | - if (ret != DRIZZLE_RETURN_OK) |
880 | + drizzle_return_t ret= drizzle_connect(con); |
881 | + if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) |
882 | { |
883 | + const char *error= drizzle_error(con); |
884 | drizzle_quit(con); |
885 | - SKIP_IF_(ret != DRIZZLE_RETURN_OK, "Drizzle connection failure"); |
886 | + SKIP_IF_(ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(ret)); |
887 | } |
888 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s(%s)", drizzle_error(con), drizzle_strerror(ret)); |
889 | |
890 | - result= drizzle_start_binlog(con, 0, "", 0, &ret); |
891 | - ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "Drizzle binlog start failure"); |
892 | + drizzle_result_st *result= drizzle_start_binlog(con, 0, "", 0, &ret); |
893 | + ASSERT_TRUE(result); |
894 | + SKIP_IF_(ret == DRIZZLE_RETURN_ERROR_CODE, "Binlog is not open?: %s(%s)", drizzle_error(con), drizzle_strerror(ret)); |
895 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "Drizzle binlog start failure: %s(%s)", drizzle_error(con), drizzle_strerror(ret)); |
896 | |
897 | while (ret == DRIZZLE_RETURN_OK) |
898 | { |
899 | @@ -84,7 +87,8 @@ |
900 | ASSERT_FALSE_((drizzle_binlog_event_type(result) >= DRIZZLE_EVENT_TYPE_END), "Bad event type: %d", drizzle_binlog_event_type(result)); |
901 | } |
902 | |
903 | - drizzle_quit(con); |
904 | + ret= drizzle_quit(con); |
905 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_strerror(ret)); |
906 | |
907 | return EXIT_SUCCESS; |
908 | } |
909 | |
910 | === modified file 'tests/unit/column.c' |
911 | --- tests/unit/column.c 2012-12-29 10:49:09 +0000 |
912 | +++ tests/unit/column.c 2012-12-30 02:26:20 +0000 |
913 | @@ -46,20 +46,29 @@ |
914 | { |
915 | (void) argc; |
916 | (void) argv; |
917 | - drizzle_return_t ret; |
918 | - drizzle_result_st *result; |
919 | drizzle_row_t row; |
920 | int num_fields; |
921 | |
922 | - drizzle_st *con= drizzle_create_tcp("localhost", 3306, "root", "", "libdrizzle", 0); |
923 | + drizzle_st *con= drizzle_create_tcp("localhost", DRIZZLE_DEFAULT_TCP_PORT, "root", NULL, NULL, 0); |
924 | ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); |
925 | |
926 | - ret = drizzle_connect(con); |
927 | - if (ret != DRIZZLE_RETURN_OK) |
928 | + drizzle_return_t ret= drizzle_connect(con); |
929 | + if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) |
930 | { |
931 | + const char *error= drizzle_error(con); |
932 | drizzle_quit(con); |
933 | - SKIP_IF_(ret != DRIZZLE_RETURN_OK, "Drizzle connection failure"); |
934 | + SKIP_IF_(ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(ret)); |
935 | } |
936 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s(%s)", drizzle_error(con), strerror(ret)); |
937 | + |
938 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
939 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
940 | + |
941 | + drizzle_query_str(con, "CREATE SCHEMA libdrizzle", &ret); |
942 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
943 | + |
944 | + drizzle_result_st *result= drizzle_select_db(con, "libdrizzle", &ret); |
945 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "USE libdrizzle"); |
946 | |
947 | drizzle_query_str(con, "create table libdrizzle.t1 (a int primary key auto_increment, b varchar(255), c timestamp default current_timestamp)", &ret); |
948 | ASSERT_TRUE_(ret == DRIZZLE_RETURN_OK, "create table libdrizzle.t1 (a int primary key auto_increment, b varchar(255), c timestamp default current_timestamp)"); |
949 | @@ -102,9 +111,14 @@ |
950 | |
951 | drizzle_result_free(result); |
952 | |
953 | - drizzle_query_str(con, "drop table libdrizzle.t1", &ret); |
954 | - ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "drop table libdrizzle.t1"); |
955 | - |
956 | - drizzle_quit(con); |
957 | + drizzle_query_str(con, "DROP TABLE libdrizzle.t1", &ret); |
958 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP TABLE libdrizzle.t1"); |
959 | + |
960 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
961 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP SCHEMA libdrizzle (%s)", drizzle_error(con)); |
962 | + |
963 | + ret= drizzle_quit(con); |
964 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_strerror(ret)); |
965 | + |
966 | return EXIT_SUCCESS; |
967 | } |
968 | |
969 | === modified file 'tests/unit/connect.c' |
970 | --- tests/unit/connect.c 2012-12-29 10:49:09 +0000 |
971 | +++ tests/unit/connect.c 2012-12-30 02:26:20 +0000 |
972 | @@ -46,22 +46,21 @@ |
973 | { |
974 | (void) argc; |
975 | (void) argv; |
976 | - drizzle_st *con; |
977 | - drizzle_return_t ret; |
978 | - |
979 | - con = drizzle_create_tcp("localhost", 3306, "root", "", "", 0); |
980 | - if (con == NULL) |
981 | - { |
982 | - printf("Drizzle connection object creation error\n"); |
983 | - return EXIT_FAILURE; |
984 | - } |
985 | - ret = drizzle_connect(con); |
986 | - if (ret != DRIZZLE_RETURN_OK) |
987 | - { |
988 | + |
989 | + drizzle_st *con= drizzle_create_tcp("localhost", DRIZZLE_DEFAULT_TCP_PORT, "root", NULL, NULL, 0); |
990 | + ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); |
991 | + |
992 | + drizzle_return_t ret= drizzle_connect(con); |
993 | + if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) |
994 | + { |
995 | + const char *error= drizzle_error(con); |
996 | drizzle_quit(con); |
997 | - SKIP_IF_(ret != DRIZZLE_RETURN_OK, "Drizzle connection failure"); |
998 | + SKIP_IF_(ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(ret)); |
999 | } |
1000 | - |
1001 | - drizzle_quit(con); |
1002 | + ASSERT_EQ(DRIZZLE_RETURN_OK, ret); |
1003 | + |
1004 | + ret= drizzle_quit(con); |
1005 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_strerror(ret)); |
1006 | + |
1007 | return EXIT_SUCCESS; |
1008 | } |
1009 | |
1010 | === modified file 'tests/unit/insert_id.c' |
1011 | --- tests/unit/insert_id.c 2012-12-29 10:49:09 +0000 |
1012 | +++ tests/unit/insert_id.c 2012-12-30 02:26:20 +0000 |
1013 | @@ -48,20 +48,31 @@ |
1014 | (void) argc; |
1015 | (void) argv; |
1016 | |
1017 | - drizzle_st *con= drizzle_create_tcp("localhost", 3306, "root", "", "libdrizzle", 0); |
1018 | + drizzle_st *con= drizzle_create_tcp("localhost", DRIZZLE_DEFAULT_TCP_PORT, "root", NULL, NULL, 0); |
1019 | ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); |
1020 | |
1021 | drizzle_return_t ret= drizzle_connect(con); |
1022 | - if (ret != DRIZZLE_RETURN_OK) |
1023 | + if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) |
1024 | { |
1025 | + const char *error= drizzle_error(con); |
1026 | drizzle_quit(con); |
1027 | - SKIP_IF_(ret != DRIZZLE_RETURN_OK, "Drizzle connection failure"); |
1028 | + SKIP_IF_(ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(ret)); |
1029 | } |
1030 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_error(con)); |
1031 | + |
1032 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1033 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1034 | + |
1035 | + drizzle_query_str(con, "CREATE SCHEMA libdrizzle", &ret); |
1036 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1037 | + |
1038 | + drizzle_result_st *result= drizzle_select_db(con, "libdrizzle", &ret); |
1039 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "USE libdrizzle"); |
1040 | |
1041 | drizzle_query_str(con, "create table libdrizzle.t1 (a int primary key auto_increment, b int)", &ret); |
1042 | ASSERT_EQ_(ret, DRIZZLE_RETURN_OK, "create table libdrizzle.t1 (a int primary key auto_increment, b int)"); |
1043 | |
1044 | - drizzle_result_st *result= drizzle_query_str(con, "insert into libdrizzle.t1 (b) values (1),(2),(3)", &ret); |
1045 | + result= drizzle_query_str(con, "insert into libdrizzle.t1 (b) values (1),(2),(3)", &ret); |
1046 | ASSERT_EQ_(ret, DRIZZLE_RETURN_OK, "insert into libdrizzle.t1 (b) values (1),(2),(3)"); |
1047 | ASSERT_TRUE(result); |
1048 | |
1049 | @@ -77,6 +88,11 @@ |
1050 | drizzle_query_str(con, "DROP TABLE libdrizzle.t1", &ret); |
1051 | ASSERT_EQ_(ret, DRIZZLE_RETURN_OK, "dROP TABLE failure"); |
1052 | |
1053 | - drizzle_quit(con); |
1054 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1055 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1056 | + |
1057 | + ret= drizzle_quit(con); |
1058 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_strerror(ret)); |
1059 | + |
1060 | return EXIT_SUCCESS; |
1061 | } |
1062 | |
1063 | === modified file 'tests/unit/query.c' |
1064 | --- tests/unit/query.c 2012-12-29 10:49:09 +0000 |
1065 | +++ tests/unit/query.c 2012-12-30 02:26:20 +0000 |
1066 | @@ -46,24 +46,29 @@ |
1067 | { |
1068 | (void) argc; |
1069 | (void) argv; |
1070 | - drizzle_st *con; |
1071 | - drizzle_return_t ret; |
1072 | - drizzle_result_st *result; |
1073 | drizzle_row_t row; |
1074 | int num_fields; |
1075 | |
1076 | - con = drizzle_create_tcp("localhost", 3306, "root", "", "libdrizzle", 0); |
1077 | - if (con == NULL) |
1078 | - { |
1079 | - printf("Drizzle connection object creation error\n"); |
1080 | - return EXIT_FAILURE; |
1081 | - } |
1082 | - ret = drizzle_connect(con); |
1083 | - if (ret != DRIZZLE_RETURN_OK) |
1084 | - { |
1085 | + drizzle_st *con= drizzle_create_tcp("localhost", DRIZZLE_DEFAULT_TCP_PORT, "root", NULL, NULL, 0); |
1086 | + ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); |
1087 | + |
1088 | + drizzle_return_t ret= drizzle_connect(con); |
1089 | + if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) |
1090 | + { |
1091 | + const char *error= drizzle_error(con); |
1092 | drizzle_quit(con); |
1093 | - SKIP_IF_(ret != DRIZZLE_RETURN_OK, "Drizzle connection failure"); |
1094 | + SKIP_IF_(ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(ret)); |
1095 | } |
1096 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "drizzle_connect(): %s(%s)", drizzle_error(con), drizzle_strerror(ret)); |
1097 | + |
1098 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1099 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1100 | + |
1101 | + drizzle_query_str(con, "CREATE SCHEMA libdrizzle", &ret); |
1102 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1103 | + |
1104 | + drizzle_result_st *result= drizzle_select_db(con, "libdrizzle", &ret); |
1105 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "USE libdrizzle"); |
1106 | |
1107 | drizzle_query_str(con, "create table libdrizzle.t1 (a int)", &ret); |
1108 | if (ret != DRIZZLE_RETURN_OK) |
1109 | @@ -114,14 +119,14 @@ |
1110 | |
1111 | drizzle_result_free(result); |
1112 | |
1113 | - drizzle_query_str(con, "drop table libdrizzle.t1", &ret); |
1114 | - if (ret != DRIZZLE_RETURN_OK) |
1115 | - { |
1116 | - printf("Drop table failure\n"); |
1117 | - return EXIT_FAILURE; |
1118 | - } |
1119 | - |
1120 | - |
1121 | - drizzle_quit(con); |
1122 | + drizzle_query_str(con, "DROP TABLE libdrizzle.t1", &ret); |
1123 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP TABLE libdrizzle.t1"); |
1124 | + |
1125 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1126 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1127 | + |
1128 | + ret= drizzle_quit(con); |
1129 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_strerror(ret)); |
1130 | + |
1131 | return EXIT_SUCCESS; |
1132 | } |
1133 | |
1134 | === modified file 'tests/unit/row.c' |
1135 | --- tests/unit/row.c 2012-12-29 10:49:09 +0000 |
1136 | +++ tests/unit/row.c 2012-12-30 02:26:20 +0000 |
1137 | @@ -46,24 +46,29 @@ |
1138 | { |
1139 | (void) argc; |
1140 | (void) argv; |
1141 | - drizzle_st *con; |
1142 | - drizzle_return_t ret; |
1143 | - drizzle_result_st *result; |
1144 | drizzle_row_t row; |
1145 | int num_fields; |
1146 | |
1147 | - con = drizzle_create_tcp("localhost", 3306, "root", "", "libdrizzle", 0); |
1148 | - if (con == NULL) |
1149 | - { |
1150 | - printf("Drizzle connection object creation error\n"); |
1151 | - return EXIT_FAILURE; |
1152 | - } |
1153 | - ret = drizzle_connect(con); |
1154 | - if (ret != DRIZZLE_RETURN_OK) |
1155 | - { |
1156 | + drizzle_st *con= drizzle_create_tcp("localhost", DRIZZLE_DEFAULT_TCP_PORT, "root", NULL, NULL, 0); |
1157 | + ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); |
1158 | + |
1159 | + drizzle_return_t ret= drizzle_connect(con); |
1160 | + if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) |
1161 | + { |
1162 | + const char *error= drizzle_error(con); |
1163 | drizzle_quit(con); |
1164 | - SKIP_IF_(ret != DRIZZLE_RETURN_OK, "Drizzle connection failure"); |
1165 | + SKIP_IF_(ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(ret)); |
1166 | } |
1167 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "drizzle_connect(): %s(%s)", drizzle_error(con), drizzle_strerror(ret)); |
1168 | + |
1169 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1170 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1171 | + |
1172 | + drizzle_query_str(con, "CREATE SCHEMA libdrizzle", &ret); |
1173 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1174 | + |
1175 | + drizzle_result_st *result= drizzle_select_db(con, "libdrizzle", &ret); |
1176 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "USE libdrizzle"); |
1177 | |
1178 | drizzle_query_str(con, "create table libdrizzle.t1 (a int)", &ret); |
1179 | if (ret != DRIZZLE_RETURN_OK) |
1180 | @@ -142,14 +147,14 @@ |
1181 | |
1182 | drizzle_result_free(result); |
1183 | |
1184 | - drizzle_query_str(con, "drop table libdrizzle.t1", &ret); |
1185 | - if (ret != DRIZZLE_RETURN_OK) |
1186 | - { |
1187 | - printf("Drop table failure\n"); |
1188 | - return EXIT_FAILURE; |
1189 | - } |
1190 | - |
1191 | - |
1192 | - drizzle_quit(con); |
1193 | + drizzle_query_str(con, "DROP TABLE libdrizzle.t1", &ret); |
1194 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP TABLE libdrizzle.t1"); |
1195 | + |
1196 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1197 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1198 | + |
1199 | + ret= drizzle_quit(con); |
1200 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_strerror(ret)); |
1201 | + |
1202 | return EXIT_SUCCESS; |
1203 | } |
1204 | |
1205 | === modified file 'tests/unit/statement.c' |
1206 | --- tests/unit/statement.c 2012-12-29 10:49:09 +0000 |
1207 | +++ tests/unit/statement.c 2012-12-30 02:26:20 +0000 |
1208 | @@ -49,50 +49,42 @@ |
1209 | { |
1210 | (void) argc; |
1211 | (void) argv; |
1212 | - drizzle_st *con; |
1213 | - drizzle_return_t ret; |
1214 | drizzle_stmt_st *stmt; |
1215 | |
1216 | - con = drizzle_create_tcp("localhost", 3306, "root", "", "libdrizzle", 0); |
1217 | - if (con == NULL) |
1218 | - { |
1219 | - printf("Drizzle connection object creation error\n"); |
1220 | - return EXIT_FAILURE; |
1221 | - } |
1222 | - ret = drizzle_connect(con); |
1223 | - if (ret != DRIZZLE_RETURN_OK) |
1224 | - { |
1225 | + drizzle_st *con= drizzle_create_tcp("localhost", DRIZZLE_DEFAULT_TCP_PORT, "root", NULL, NULL, 0); |
1226 | + ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); |
1227 | + |
1228 | + drizzle_return_t ret= drizzle_connect(con); |
1229 | + if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) |
1230 | + { |
1231 | + const char *error= drizzle_error(con); |
1232 | drizzle_quit(con); |
1233 | - SKIP_IF_(ret != DRIZZLE_RETURN_OK, "Drizzle connection failure"); |
1234 | + SKIP_IF_(ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(ret)); |
1235 | } |
1236 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "drizzle_connect(): %s(%s)", drizzle_error(con), drizzle_strerror(ret)); |
1237 | + |
1238 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1239 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1240 | + |
1241 | + drizzle_query_str(con, "CREATE SCHEMA libdrizzle", &ret); |
1242 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1243 | + |
1244 | + drizzle_result_st *result= drizzle_select_db(con, "libdrizzle", &ret); |
1245 | + ASSERT_TRUE(result); |
1246 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "USE libdrizzle"); |
1247 | |
1248 | drizzle_query_str(con, "create table libdrizzle.t1 (a int)", &ret); |
1249 | - if (ret != DRIZZLE_RETURN_OK) |
1250 | - { |
1251 | - printf("Create table failure\n"); |
1252 | - return EXIT_FAILURE; |
1253 | - } |
1254 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "create table libdrizzle.t1 (a int): %s", drizzle_error(con)); |
1255 | |
1256 | drizzle_query_str(con, "insert into libdrizzle.t1 values (1),(2),(3)", &ret); |
1257 | - if (ret != DRIZZLE_RETURN_OK) |
1258 | - { |
1259 | - printf("Insert failure\n"); |
1260 | - return EXIT_FAILURE; |
1261 | - } |
1262 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_error(con)); |
1263 | |
1264 | const char *query= "select * from libdrizzle.t1 where a > ?"; |
1265 | stmt= drizzle_stmt_prepare(con, query, strlen(query), &ret); |
1266 | - if (ret != DRIZZLE_RETURN_OK) |
1267 | - { |
1268 | - printf("Prepare failure\n"); |
1269 | - return EXIT_FAILURE; |
1270 | - } |
1271 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_error(con)); |
1272 | + |
1273 | /* Query should have 1 param */ |
1274 | - if (drizzle_stmt_param_count(stmt) != 1) |
1275 | - { |
1276 | - printf("Retrieved bad param count\n"); |
1277 | - return EXIT_FAILURE; |
1278 | - } |
1279 | + ASSERT_EQ_(1, drizzle_stmt_param_count(stmt), "Retrieved bad param count"); |
1280 | |
1281 | uint32_t val= 1; |
1282 | ret = drizzle_stmt_bind_param(stmt, 0, DRIZZLE_COLUMN_TYPE_LONG, &val, 4, DRIZZLE_BIND_OPTION_NONE); |
1283 | @@ -145,14 +137,14 @@ |
1284 | return EXIT_FAILURE; |
1285 | } |
1286 | |
1287 | - drizzle_query_str(con, "drop table libdrizzle.t1", &ret); |
1288 | - if (ret != DRIZZLE_RETURN_OK) |
1289 | - { |
1290 | - printf("Drop table failure\n"); |
1291 | - return EXIT_FAILURE; |
1292 | - } |
1293 | - |
1294 | - |
1295 | - drizzle_quit(con); |
1296 | + drizzle_query_str(con, "DROP TABLE libdrizzle.t1", &ret); |
1297 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP TABLE libdrizzle.t1"); |
1298 | + |
1299 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1300 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1301 | + |
1302 | + ret= drizzle_quit(con); |
1303 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_strerror(ret)); |
1304 | + |
1305 | return EXIT_SUCCESS; |
1306 | } |
1307 | |
1308 | === modified file 'tests/unit/unbuffered_query.c' |
1309 | --- tests/unit/unbuffered_query.c 2012-12-29 10:49:09 +0000 |
1310 | +++ tests/unit/unbuffered_query.c 2012-12-30 02:26:20 +0000 |
1311 | @@ -46,24 +46,29 @@ |
1312 | { |
1313 | (void) argc; |
1314 | (void) argv; |
1315 | - drizzle_st *con; |
1316 | - drizzle_return_t ret; |
1317 | - drizzle_result_st *result; |
1318 | drizzle_row_t row; |
1319 | int num_fields; |
1320 | |
1321 | - con = drizzle_create_tcp("localhost", 3306, "root", "", "libdrizzle", 0); |
1322 | - if (con == NULL) |
1323 | - { |
1324 | - printf("Drizzle connection object creation error\n"); |
1325 | - return EXIT_FAILURE; |
1326 | - } |
1327 | - ret = drizzle_connect(con); |
1328 | - if (ret != DRIZZLE_RETURN_OK) |
1329 | - { |
1330 | + drizzle_st *con= drizzle_create_tcp("localhost", DRIZZLE_DEFAULT_TCP_PORT, "root", NULL, NULL, 0); |
1331 | + ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); |
1332 | + |
1333 | + drizzle_return_t ret= drizzle_connect(con); |
1334 | + if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) |
1335 | + { |
1336 | + const char *error= drizzle_error(con); |
1337 | drizzle_quit(con); |
1338 | - SKIP_IF_(ret != DRIZZLE_RETURN_OK, "Drizzle connection failure"); |
1339 | + SKIP_IF_(ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(ret)); |
1340 | } |
1341 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "drizzle_connect(): %s(%s)", drizzle_error(con), drizzle_strerror(ret)); |
1342 | + |
1343 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1344 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1345 | + |
1346 | + drizzle_query_str(con, "CREATE SCHEMA libdrizzle", &ret); |
1347 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "CREATE SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1348 | + |
1349 | + drizzle_result_st *result= drizzle_select_db(con, "libdrizzle", &ret); |
1350 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "USE libdrizzle"); |
1351 | |
1352 | drizzle_query_str(con, "create table libdrizzle.t1 (a int)", &ret); |
1353 | if (ret != DRIZZLE_RETURN_OK) |
1354 | @@ -132,14 +137,14 @@ |
1355 | |
1356 | drizzle_result_free(result); |
1357 | |
1358 | - drizzle_query_str(con, "drop table libdrizzle.t1", &ret); |
1359 | - if (ret != DRIZZLE_RETURN_OK) |
1360 | - { |
1361 | - printf("Drop table failure\n"); |
1362 | - return EXIT_FAILURE; |
1363 | - } |
1364 | - |
1365 | - |
1366 | - drizzle_quit(con); |
1367 | + drizzle_query_str(con, "DROP TABLE libdrizzle.t1", &ret); |
1368 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP TABLE libdrizzle.t1"); |
1369 | + |
1370 | + drizzle_query_str(con, "DROP SCHEMA IF EXISTS libdrizzle", &ret); |
1371 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "DROP SCHEMA libdrizzle (%s)", drizzle_error(con)); |
1372 | + |
1373 | + ret= drizzle_quit(con); |
1374 | + ASSERT_EQ_(DRIZZLE_RETURN_OK, ret, "%s", drizzle_strerror(ret)); |
1375 | + |
1376 | return EXIT_SUCCESS; |
1377 | } |
Currently the user needs the public date/time struct. But I've figured out a way of doing that much better. So Approve! many thanks for this :)