70 void drizzle_library_init(
void)
75 const char *drizzle_version(
void)
77 return LIBDRIZZLE_VERSION_STRING;
80 const char *drizzle_bugreport(
void)
82 return PACKAGE_BUGREPORT;
85 const char *drizzle_verbose_name(drizzle_verbose_t verbose)
87 if (verbose >= DRIZZLE_VERBOSE_MAX)
95 drizzle_st *drizzle_create(drizzle_st *drizzle)
100 if ( WSAStartup( MAKEWORD(2,2), &wsaData ) != 0 )
101 printf(
"Error at WSAStartup()\n");
103 struct sigaction act;
104 memset(&act, 0,
sizeof(act));
106 act.sa_handler = SIG_IGN;
107 sigaction(SIGPIPE, &act, NULL);
112 drizzle=
new (std::nothrow) drizzle_st;
118 drizzle->options= DRIZZLE_ALLOCATED;
122 drizzle->options= DRIZZLE_NONE;
126 drizzle->options|= DRIZZLE_FREE_OBJECTS;
127 drizzle->error_code= 0;
129 drizzle->verbose= DRIZZLE_VERBOSE_NEVER;
130 drizzle->con_count= 0;
131 drizzle->pfds_size= 0;
132 drizzle->query_count= 0;
133 drizzle->query_new= 0;
134 drizzle->query_running= 0;
135 drizzle->last_errno= 0;
136 drizzle->timeout= -1;
137 drizzle->con_list= NULL;
138 drizzle->context= NULL;
139 drizzle->context_free_fn= NULL;
140 drizzle->event_watch_fn= NULL;
141 drizzle->event_watch_context= NULL;
142 drizzle->log_fn= NULL;
143 drizzle->log_context= NULL;
145 drizzle->query_list= NULL;
146 drizzle->sqlstate[0]= 0;
147 drizzle->last_error[0]= 0;
152 drizzle_st *drizzle_clone(drizzle_st *drizzle,
const drizzle_st *from)
154 drizzle= drizzle_create(drizzle);
160 drizzle->options|= (from->options & int(~DRIZZLE_ALLOCATED));
162 for (drizzle_con_st *con= from->con_list; con != NULL; con= con->next)
164 if (drizzle_con_clone(drizzle, NULL, con) == NULL)
166 drizzle_free(drizzle);
174 void drizzle_free(drizzle_st *drizzle)
181 if (drizzle->context != NULL && drizzle->context_free_fn != NULL)
183 drizzle->context_free_fn(drizzle, drizzle->context);
186 if (drizzle->options & DRIZZLE_FREE_OBJECTS)
188 drizzle_con_free_all(drizzle);
189 drizzle_query_free_all(drizzle);
191 else if (drizzle->options & DRIZZLE_ASSERT_DANGLING)
193 assert(drizzle->con_list == NULL);
194 assert(drizzle->query_list == NULL);
199 if (drizzle->options & DRIZZLE_ALLOCATED)
209 const char *drizzle_error(
const drizzle_st *drizzle)
216 return (
const char *)drizzle->last_error;
219 int drizzle_errno(
const drizzle_st *drizzle)
226 return drizzle->last_errno;
229 uint16_t drizzle_error_code(
const drizzle_st *drizzle)
236 return drizzle->error_code;
239 const char *drizzle_sqlstate(
const drizzle_st *drizzle)
246 return drizzle->sqlstate;
249 drizzle_options_t drizzle_options(
const drizzle_st *drizzle)
253 return drizzle_options_t();
256 return drizzle_options_t(drizzle->options);
259 void drizzle_set_options(drizzle_st *drizzle, drizzle_options_t options)
266 drizzle->options= options;
269 void drizzle_add_options(drizzle_st *drizzle, drizzle_options_t options)
276 drizzle->options|= options;
279 void drizzle_remove_options(drizzle_st *drizzle, drizzle_options_t options)
286 drizzle->options&= ~options;
289 void *drizzle_context(
const drizzle_st *drizzle)
296 return drizzle->context;
299 void drizzle_set_context(drizzle_st *drizzle,
void *context)
306 drizzle->context= context;
309 void drizzle_set_context_free_fn(drizzle_st *drizzle,
310 drizzle_context_free_fn *
function)
317 drizzle->context_free_fn=
function;
320 int drizzle_timeout(
const drizzle_st *drizzle)
327 return drizzle->timeout;
330 void drizzle_set_timeout(drizzle_st *drizzle,
int timeout)
337 drizzle->timeout= timeout;
340 drizzle_verbose_t drizzle_verbose(
const drizzle_st *drizzle)
344 return drizzle_verbose_t();
347 return drizzle->verbose;
350 void drizzle_set_verbose(drizzle_st *drizzle, drizzle_verbose_t verbose)
357 drizzle->verbose= verbose;
360 void drizzle_set_log_fn(drizzle_st *drizzle, drizzle_log_fn *
function,
368 drizzle->log_fn=
function;
369 drizzle->log_context= context;
372 void drizzle_set_event_watch_fn(drizzle_st *drizzle,
373 drizzle_event_watch_fn *
function,
381 drizzle->event_watch_fn=
function;
382 drizzle->event_watch_context= context;
385 drizzle_con_st *drizzle_con_create(drizzle_st *drizzle, drizzle_con_st *con)
394 con=
new (std::nothrow) drizzle_con_st;
405 con->options= DRIZZLE_CON_ALLOCATED;
412 if (drizzle->con_list != NULL)
414 drizzle->con_list->prev= con;
416 con->next= drizzle->con_list;
418 drizzle->con_list= con;
419 drizzle->con_count++;
421 con->packet_number= 0;
422 con->protocol_version= 0;
423 con->state_current= 0;
426 con->capabilities= DRIZZLE_CAPABILITIES_NONE;
428 con->command= drizzle_command_t();
429 con->options|= DRIZZLE_CON_MYSQL;
430 con->socket_type= DRIZZLE_CON_SOCKET_TCP;
431 con->status= DRIZZLE_CON_STATUS_NONE;
432 con->max_packet_size= DRIZZLE_MAX_PACKET_SIZE;
433 con->result_count= 0;
435 con->backlog= DRIZZLE_DEFAULT_BACKLOG;
438 con->command_offset= 0;
439 con->command_size= 0;
440 con->command_total= 0;
442 con->addrinfo_next= NULL;
443 con->buffer_ptr= con->buffer;
444 con->command_buffer= NULL;
445 con->command_data= NULL;
447 con->context_free_fn= NULL;
448 con->drizzle= drizzle;
453 con->result_list= NULL;
455 con->socket.tcp.addrinfo= NULL;
456 con->socket.tcp.host= NULL;
457 con->socket.tcp.port= 0;
462 con->server_version[0]= 0;
465 con->ssl_context= NULL;
467 con->ssl_state= DRIZZLE_SSL_STATE_NONE;
472 drizzle_con_st *drizzle_con_clone(drizzle_st *drizzle, drizzle_con_st *con,
473 const drizzle_con_st *from)
480 con= drizzle_con_create(drizzle, con);
487 con->options|= (from->options & int(~(
488 DRIZZLE_CON_ALLOCATED|DRIZZLE_CON_READY|
489 DRIZZLE_CON_NO_RESULT_READ|DRIZZLE_CON_IO_READY|
490 DRIZZLE_CON_LISTEN)));
491 con->backlog= from->backlog;
492 strcpy(con->db, from->db);
493 strcpy(con->password, from->password);
494 strcpy(con->user, from->user);
496 switch (from->socket_type)
498 case DRIZZLE_CON_SOCKET_TCP:
499 drizzle_con_set_tcp(con, from->socket.tcp.host, from->socket.tcp.port);
502 case DRIZZLE_CON_SOCKET_UDS:
503 drizzle_con_set_uds(con, from->socket.uds.path_buffer);
513 void drizzle_con_free(drizzle_con_st *con)
520 if (con->context != NULL and con->context_free_fn != NULL)
522 con->context_free_fn(con, con->context);
525 if (con->drizzle->options & DRIZZLE_FREE_OBJECTS)
527 drizzle_result_free_all(con);
529 else if (con->drizzle->options & DRIZZLE_ASSERT_DANGLING)
531 assert(con->result_list == NULL);
536 drizzle_con_close(con);
541 if (con->drizzle->con_list == con)
542 con->drizzle->con_list= con->next;
544 if (con->prev != NULL)
545 con->prev->next= con->next;
547 if (con->next != NULL)
548 con->next->prev= con->prev;
553 if (con->ssl_context)
554 SSL_CTX_free(con->ssl_context);
556 con->drizzle->con_count--;
558 if (con->options & DRIZZLE_CON_ALLOCATED)
564 void drizzle_con_free_all(drizzle_st *drizzle)
566 while (drizzle->con_list != NULL)
567 drizzle_con_free(drizzle->con_list);
570 drizzle_return_t drizzle_con_wait(drizzle_st *drizzle)
574 return DRIZZLE_RETURN_INVALID_ARGUMENT;
578 if (drizzle->pfds_size < drizzle->con_count)
580 pfds= (
struct pollfd *)realloc(drizzle->pfds, drizzle->con_count *
sizeof(
struct pollfd));
584 return DRIZZLE_RETURN_MEMORY;
588 drizzle->pfds_size= drizzle->con_count;
596 for (drizzle_con_st *con= drizzle->con_list; con != NULL; con= con->next)
598 if (con->events == 0)
604 pfds[x].events= con->events;
612 return DRIZZLE_RETURN_NO_ACTIVE_CONNECTIONS;
621 ret= poll(pfds, x, drizzle->timeout);
633 drizzle->last_errno= errno;
634 return DRIZZLE_RETURN_ERRNO;
643 return DRIZZLE_RETURN_TIMEOUT;
647 for (drizzle_con_st *con= drizzle->con_list; con != NULL; con= con->next)
649 if (con->events == 0)
654 drizzle_return_t dret= drizzle_con_set_revents(con, pfds[x].revents);
655 if (dret != DRIZZLE_RETURN_OK)
663 return DRIZZLE_RETURN_OK;
666 drizzle_con_st *drizzle_con_ready(drizzle_st *drizzle)
676 for (drizzle_con_st *con= drizzle->con_list; con != NULL; con= con->next)
678 if (con->options & DRIZZLE_CON_IO_READY)
680 con->options&= int(~DRIZZLE_CON_IO_READY);
688 drizzle_con_st *drizzle_con_ready_listen(drizzle_st *drizzle)
698 for (drizzle_con_st *con= drizzle->con_list; con != NULL; con= con->next)
700 if ((con->options & (DRIZZLE_CON_IO_READY | DRIZZLE_CON_LISTEN)) ==
701 (DRIZZLE_CON_IO_READY | DRIZZLE_CON_LISTEN))
703 con->options&= int(~DRIZZLE_CON_IO_READY);
715 drizzle_con_st *drizzle_con_add_tcp(drizzle_st *drizzle, drizzle_con_st *con,
716 const char *host, in_port_t port,
717 const char *user,
const char *password,
719 drizzle_con_options_t options)
726 con= drizzle_con_create(drizzle, con);
732 drizzle_con_set_tcp(con, host, port);
733 drizzle_con_set_auth(con, user, password);
734 drizzle_con_set_db(con, db);
735 drizzle_con_add_options(con, options);
740 drizzle_con_st *drizzle_con_add_uds(drizzle_st *drizzle, drizzle_con_st *con,
741 const char *uds,
const char *user,
742 const char *password,
const char *db,
743 drizzle_con_options_t options)
750 con= drizzle_con_create(drizzle, con);
756 drizzle_con_set_uds(con, uds);
757 drizzle_con_set_auth(con, user, password);
758 drizzle_con_set_db(con, db);
759 drizzle_con_add_options(con, options);
768 drizzle_con_st *drizzle_con_add_tcp_listen(drizzle_st *drizzle,
770 const char *host, in_port_t port,
772 drizzle_con_options_t options)
779 con= drizzle_con_create(drizzle, con);
785 drizzle_con_set_tcp(con, host, port);
786 drizzle_con_set_backlog(con, backlog);
787 drizzle_con_add_options(con, drizzle_con_options_t(DRIZZLE_CON_LISTEN |
int(options)));
792 drizzle_con_st *drizzle_con_add_uds_listen(drizzle_st *drizzle,
794 const char *uds,
int backlog,
795 drizzle_con_options_t options)
802 con= drizzle_con_create(drizzle, con);
808 drizzle_con_set_uds(con, uds);
809 drizzle_con_set_backlog(con, backlog);
810 drizzle_con_add_options(con, drizzle_con_options_t(DRIZZLE_CON_LISTEN |
int(options)));
815 drizzle_con_st *drizzle_con_accept(drizzle_st *drizzle, drizzle_con_st *con,
816 drizzle_return_t *ret_ptr)
818 drizzle_return_t unused_ret;
821 ret_ptr= &unused_ret;
831 drizzle_con_st *ready;
833 if ((ready= drizzle_con_ready_listen(drizzle)) != NULL)
835 int fd= accept(ready->fd, NULL, NULL);
837 con= drizzle_con_create(drizzle, con);
840 (void)closesocket(fd);
841 *ret_ptr= DRIZZLE_RETURN_MEMORY;
845 *ret_ptr= drizzle_con_set_fd(con, fd);
846 if (*ret_ptr != DRIZZLE_RETURN_OK)
848 (void)closesocket(fd);
852 if (ready->options & DRIZZLE_CON_MYSQL)
853 drizzle_con_add_options(con, DRIZZLE_CON_MYSQL);
855 *ret_ptr= DRIZZLE_RETURN_OK;
859 if (drizzle->options & DRIZZLE_NON_BLOCKING)
861 *ret_ptr= DRIZZLE_RETURN_IO_WAIT;
865 for (ready= drizzle->con_list; ready != NULL; ready= ready->next)
867 if (ready->options & DRIZZLE_CON_LISTEN)
868 drizzle_con_set_events(ready, POLLIN);
871 *ret_ptr= drizzle_con_wait(drizzle);
872 if (*ret_ptr != DRIZZLE_RETURN_OK)
882 const char *format, ...)
891 char log_buffer[DRIZZLE_MAX_ERROR_SIZE];
894 size= strlen(
function);
895 char *ptr= (
char *)memcpy(log_buffer,
function, size);
901 va_start(args, format);
902 written= vsnprintf(ptr, DRIZZLE_MAX_ERROR_SIZE - size, format, args);
907 size= DRIZZLE_MAX_ERROR_SIZE;
914 if (size >= DRIZZLE_MAX_ERROR_SIZE)
916 size= DRIZZLE_MAX_ERROR_SIZE - 1;
920 if (drizzle->log_fn == NULL)
922 memcpy(drizzle->last_error, log_buffer, size + 1);
926 drizzle->log_fn(log_buffer, DRIZZLE_VERBOSE_ERROR, drizzle->log_context);
931 const char *format, va_list args)
938 char log_buffer[DRIZZLE_MAX_ERROR_SIZE];
940 if (drizzle->log_fn == NULL)
942 printf(
"%5s: ", drizzle_verbose_name(verbose));
943 vprintf(format, args);
948 vsnprintf(log_buffer, DRIZZLE_MAX_ERROR_SIZE, format, args);
949 log_buffer[DRIZZLE_MAX_ERROR_SIZE-1]= 0;
950 drizzle->log_fn(log_buffer, verbose, drizzle->log_context);