70 const char *drizzle_version(
void)
72 return LIBDRIZZLE_VERSION_STRING;
75 const char *drizzle_bugreport(
void)
77 return PACKAGE_BUGREPORT;
80 const char *drizzle_verbose_name(drizzle_verbose_t verbose)
82 if (verbose >= DRIZZLE_VERBOSE_MAX)
90 drizzle_st *drizzle_create(drizzle_st *drizzle)
95 if ( WSAStartup( MAKEWORD(2,2), &wsaData ) != 0 )
96 printf(
"Error at WSAStartup()\n");
99 memset(&act, 0,
sizeof(act));
101 act.sa_handler = SIG_IGN;
102 sigaction(SIGPIPE, &act, NULL);
107 drizzle=
new (std::nothrow) drizzle_st;
113 drizzle->options= DRIZZLE_ALLOCATED;
117 drizzle->options= DRIZZLE_NONE;
121 drizzle->options|= DRIZZLE_FREE_OBJECTS;
122 drizzle->error_code= 0;
124 drizzle->verbose= DRIZZLE_VERBOSE_NEVER;
125 drizzle->con_count= 0;
126 drizzle->pfds_size= 0;
127 drizzle->query_count= 0;
128 drizzle->query_new= 0;
129 drizzle->query_running= 0;
130 drizzle->last_errno= 0;
131 drizzle->timeout= -1;
132 drizzle->con_list= NULL;
133 drizzle->context= NULL;
134 drizzle->context_free_fn= NULL;
135 drizzle->event_watch_fn= NULL;
136 drizzle->event_watch_context= NULL;
137 drizzle->log_fn= NULL;
138 drizzle->log_context= NULL;
140 drizzle->query_list= NULL;
141 drizzle->sqlstate[0]= 0;
142 drizzle->last_error[0]= 0;
147 drizzle_st *drizzle_clone(drizzle_st *drizzle,
const drizzle_st *from)
149 drizzle= drizzle_create(drizzle);
155 drizzle->options|= (from->options & int(~DRIZZLE_ALLOCATED));
157 for (drizzle_con_st *con= from->con_list; con != NULL; con= con->next)
159 if (drizzle_con_clone(drizzle, NULL, con) == NULL)
161 drizzle_free(drizzle);
169 void drizzle_free(drizzle_st *drizzle)
176 if (drizzle->context != NULL && drizzle->context_free_fn != NULL)
178 drizzle->context_free_fn(drizzle, drizzle->context);
181 if (drizzle->options & DRIZZLE_FREE_OBJECTS)
183 drizzle_con_free_all(drizzle);
184 drizzle_query_free_all(drizzle);
186 else if (drizzle->options & DRIZZLE_ASSERT_DANGLING)
188 assert(drizzle->con_list == NULL);
189 assert(drizzle->query_list == NULL);
194 if (drizzle->options & DRIZZLE_ALLOCATED)
204 const char *drizzle_error(
const drizzle_st *drizzle)
211 return (
const char *)drizzle->last_error;
214 int drizzle_errno(
const drizzle_st *drizzle)
221 return drizzle->last_errno;
224 uint16_t drizzle_error_code(
const drizzle_st *drizzle)
231 return drizzle->error_code;
234 const char *drizzle_sqlstate(
const drizzle_st *drizzle)
241 return drizzle->sqlstate;
244 drizzle_options_t drizzle_options(
const drizzle_st *drizzle)
248 return drizzle_options_t();
251 return drizzle_options_t(drizzle->options);
254 void drizzle_set_options(drizzle_st *drizzle, drizzle_options_t options)
261 drizzle->options= options;
264 void drizzle_add_options(drizzle_st *drizzle, drizzle_options_t options)
271 drizzle->options|= options;
274 void drizzle_remove_options(drizzle_st *drizzle, drizzle_options_t options)
281 drizzle->options&= ~options;
284 void *drizzle_context(
const drizzle_st *drizzle)
291 return drizzle->context;
294 void drizzle_set_context(drizzle_st *drizzle,
void *context)
301 drizzle->context= context;
304 void drizzle_set_context_free_fn(drizzle_st *drizzle,
305 drizzle_context_free_fn *
function)
312 drizzle->context_free_fn=
function;
315 int drizzle_timeout(
const drizzle_st *drizzle)
322 return drizzle->timeout;
325 void drizzle_set_timeout(drizzle_st *drizzle,
int timeout)
332 drizzle->timeout= timeout;
335 drizzle_verbose_t drizzle_verbose(
const drizzle_st *drizzle)
339 return drizzle_verbose_t();
342 return drizzle->verbose;
345 void drizzle_set_verbose(drizzle_st *drizzle, drizzle_verbose_t verbose)
352 drizzle->verbose= verbose;
355 void drizzle_set_log_fn(drizzle_st *drizzle, drizzle_log_fn *
function,
363 drizzle->log_fn=
function;
364 drizzle->log_context= context;
367 void drizzle_set_event_watch_fn(drizzle_st *drizzle,
368 drizzle_event_watch_fn *
function,
376 drizzle->event_watch_fn=
function;
377 drizzle->event_watch_context= context;
380 drizzle_con_st *drizzle_con_create(drizzle_st *drizzle, drizzle_con_st *con)
389 con=
new (std::nothrow) drizzle_con_st;
400 con->options= DRIZZLE_CON_ALLOCATED;
407 if (drizzle->con_list != NULL)
409 drizzle->con_list->prev= con;
411 con->next= drizzle->con_list;
413 drizzle->con_list= con;
414 drizzle->con_count++;
416 con->packet_number= 0;
417 con->protocol_version= 0;
418 con->state_current= 0;
421 con->capabilities= DRIZZLE_CAPABILITIES_NONE;
423 con->command= drizzle_command_t();
424 con->options|= DRIZZLE_CON_MYSQL;
425 con->socket_type= DRIZZLE_CON_SOCKET_TCP;
426 con->status= DRIZZLE_CON_STATUS_NONE;
427 con->max_packet_size= DRIZZLE_MAX_PACKET_SIZE;
428 con->result_count= 0;
430 con->backlog= DRIZZLE_DEFAULT_BACKLOG;
433 con->command_offset= 0;
434 con->command_size= 0;
435 con->command_total= 0;
437 con->addrinfo_next= NULL;
438 con->buffer_ptr= con->buffer;
439 con->command_buffer= NULL;
440 con->command_data= NULL;
442 con->context_free_fn= NULL;
443 con->drizzle= drizzle;
448 con->result_list= NULL;
450 con->socket.tcp.addrinfo= NULL;
451 con->socket.tcp.host= NULL;
452 con->socket.tcp.port= 0;
457 con->server_version[0]= 0;
464 drizzle_con_st *drizzle_con_clone(drizzle_st *drizzle, drizzle_con_st *con,
465 const drizzle_con_st *from)
472 con= drizzle_con_create(drizzle, con);
479 con->options|= (from->options & int(~(
480 DRIZZLE_CON_ALLOCATED|DRIZZLE_CON_READY|
481 DRIZZLE_CON_NO_RESULT_READ|DRIZZLE_CON_IO_READY|
482 DRIZZLE_CON_LISTEN)));
483 con->backlog= from->backlog;
484 strcpy(con->db, from->db);
485 strcpy(con->password, from->password);
486 strcpy(con->user, from->user);
488 switch (from->socket_type)
490 case DRIZZLE_CON_SOCKET_TCP:
491 drizzle_con_set_tcp(con, from->socket.tcp.host, from->socket.tcp.port);
494 case DRIZZLE_CON_SOCKET_UDS:
495 drizzle_con_set_uds(con, from->socket.uds.path_buffer);
505 void drizzle_con_free(drizzle_con_st *con)
512 if (con->context != NULL and con->context_free_fn != NULL)
514 con->context_free_fn(con, con->context);
517 if (con->drizzle->options & DRIZZLE_FREE_OBJECTS)
519 drizzle_result_free_all(con);
521 else if (con->drizzle->options & DRIZZLE_ASSERT_DANGLING)
523 assert(con->result_list == NULL);
528 drizzle_con_close(con);
533 if (con->drizzle->con_list == con)
534 con->drizzle->con_list= con->next;
536 if (con->prev != NULL)
537 con->prev->next= con->next;
539 if (con->next != NULL)
540 con->next->prev= con->prev;
542 con->drizzle->con_count--;
544 if (con->options & DRIZZLE_CON_ALLOCATED)
550 void drizzle_con_free_all(drizzle_st *drizzle)
552 while (drizzle->con_list != NULL)
553 drizzle_con_free(drizzle->con_list);
556 drizzle_return_t drizzle_con_wait(drizzle_st *drizzle)
560 return DRIZZLE_RETURN_INVALID_ARGUMENT;
564 if (drizzle->pfds_size < drizzle->con_count)
566 pfds= (
struct pollfd *)realloc(drizzle->pfds, drizzle->con_count *
sizeof(
struct pollfd));
570 return DRIZZLE_RETURN_MEMORY;
574 drizzle->pfds_size= drizzle->con_count;
582 for (drizzle_con_st *con= drizzle->con_list; con != NULL; con= con->next)
584 if (con->events == 0)
590 pfds[x].events= con->events;
598 return DRIZZLE_RETURN_NO_ACTIVE_CONNECTIONS;
607 ret= poll(pfds, x, drizzle->timeout);
619 drizzle->last_errno= errno;
620 return DRIZZLE_RETURN_ERRNO;
629 return DRIZZLE_RETURN_TIMEOUT;
633 for (drizzle_con_st *con= drizzle->con_list; con != NULL; con= con->next)
635 if (con->events == 0)
640 drizzle_return_t dret= drizzle_con_set_revents(con, pfds[x].revents);
641 if (dret != DRIZZLE_RETURN_OK)
649 return DRIZZLE_RETURN_OK;
652 drizzle_con_st *drizzle_con_ready(drizzle_st *drizzle)
662 for (drizzle_con_st *con= drizzle->con_list; con != NULL; con= con->next)
664 if (con->options & DRIZZLE_CON_IO_READY)
666 con->options&= int(~DRIZZLE_CON_IO_READY);
674 drizzle_con_st *drizzle_con_ready_listen(drizzle_st *drizzle)
684 for (drizzle_con_st *con= drizzle->con_list; con != NULL; con= con->next)
686 if ((con->options & (DRIZZLE_CON_IO_READY | DRIZZLE_CON_LISTEN)) ==
687 (DRIZZLE_CON_IO_READY | DRIZZLE_CON_LISTEN))
689 con->options&= int(~DRIZZLE_CON_IO_READY);
701 drizzle_con_st *drizzle_con_add_tcp(drizzle_st *drizzle, drizzle_con_st *con,
702 const char *host, in_port_t port,
703 const char *user,
const char *password,
705 drizzle_con_options_t options)
712 con= drizzle_con_create(drizzle, con);
718 drizzle_con_set_tcp(con, host, port);
719 drizzle_con_set_auth(con, user, password);
720 drizzle_con_set_db(con, db);
721 drizzle_con_add_options(con, options);
726 drizzle_con_st *drizzle_con_add_uds(drizzle_st *drizzle, drizzle_con_st *con,
727 const char *uds,
const char *user,
728 const char *password,
const char *db,
729 drizzle_con_options_t options)
736 con= drizzle_con_create(drizzle, con);
742 drizzle_con_set_uds(con, uds);
743 drizzle_con_set_auth(con, user, password);
744 drizzle_con_set_db(con, db);
745 drizzle_con_add_options(con, options);
754 drizzle_con_st *drizzle_con_add_tcp_listen(drizzle_st *drizzle,
756 const char *host, in_port_t port,
758 drizzle_con_options_t options)
765 con= drizzle_con_create(drizzle, con);
771 drizzle_con_set_tcp(con, host, port);
772 drizzle_con_set_backlog(con, backlog);
773 drizzle_con_add_options(con, drizzle_con_options_t(DRIZZLE_CON_LISTEN |
int(options)));
778 drizzle_con_st *drizzle_con_add_uds_listen(drizzle_st *drizzle,
780 const char *uds,
int backlog,
781 drizzle_con_options_t options)
788 con= drizzle_con_create(drizzle, con);
794 drizzle_con_set_uds(con, uds);
795 drizzle_con_set_backlog(con, backlog);
796 drizzle_con_add_options(con, drizzle_con_options_t(DRIZZLE_CON_LISTEN |
int(options)));
801 drizzle_con_st *drizzle_con_accept(drizzle_st *drizzle, drizzle_con_st *con,
802 drizzle_return_t *ret_ptr)
804 drizzle_return_t unused_ret;
807 ret_ptr= &unused_ret;
817 drizzle_con_st *ready;
819 if ((ready= drizzle_con_ready_listen(drizzle)) != NULL)
821 int fd= accept(ready->fd, NULL, NULL);
823 con= drizzle_con_create(drizzle, con);
826 (void)closesocket(fd);
827 *ret_ptr= DRIZZLE_RETURN_MEMORY;
831 *ret_ptr= drizzle_con_set_fd(con, fd);
832 if (*ret_ptr != DRIZZLE_RETURN_OK)
834 (void)closesocket(fd);
838 if (ready->options & DRIZZLE_CON_MYSQL)
839 drizzle_con_add_options(con, DRIZZLE_CON_MYSQL);
841 *ret_ptr= DRIZZLE_RETURN_OK;
845 if (drizzle->options & DRIZZLE_NON_BLOCKING)
847 *ret_ptr= DRIZZLE_RETURN_IO_WAIT;
851 for (ready= drizzle->con_list; ready != NULL; ready= ready->next)
853 if (ready->options & DRIZZLE_CON_LISTEN)
854 drizzle_con_set_events(ready, POLLIN);
857 *ret_ptr= drizzle_con_wait(drizzle);
858 if (*ret_ptr != DRIZZLE_RETURN_OK)
868 const char *format, ...)
877 char log_buffer[DRIZZLE_MAX_ERROR_SIZE];
880 size= strlen(
function);
881 char *ptr= (
char *)memcpy(log_buffer,
function, size);
887 va_start(args, format);
888 written= vsnprintf(ptr, DRIZZLE_MAX_ERROR_SIZE - size, format, args);
893 size= DRIZZLE_MAX_ERROR_SIZE;
900 if (size >= DRIZZLE_MAX_ERROR_SIZE)
902 size= DRIZZLE_MAX_ERROR_SIZE - 1;
906 if (drizzle->log_fn == NULL)
908 memcpy(drizzle->last_error, log_buffer, size + 1);
912 drizzle->log_fn(log_buffer, DRIZZLE_VERBOSE_ERROR, drizzle->log_context);
917 const char *format, va_list args)
924 char log_buffer[DRIZZLE_MAX_ERROR_SIZE];
926 if (drizzle->log_fn == NULL)
928 printf(
"%5s: ", drizzle_verbose_name(verbose));
929 vprintf(format, args);
934 vsnprintf(log_buffer, DRIZZLE_MAX_ERROR_SIZE, format, args);
935 log_buffer[DRIZZLE_MAX_ERROR_SIZE-1]= 0;
936 drizzle->log_fn(log_buffer, verbose, drizzle->log_context);