EV-MariaDB
view release on metacpan or search on metacpan
}
if (mysql_stmt_bind_param(ctx->stmt, bp)) {
char errbuf[512];
COPY_ERROR(errbuf, mysql_stmt_error(ctx->stmt));
free_stmt_bind_params(ctx);
croak("%s", errbuf);
}
}
static void start_connect(ev_mariadb_t *self) {
int status;
self->conn = mysql_init(NULL);
if (NULL == self->conn) {
croak("mysql_init failed");
}
self->connect_pid = getpid();
mysql_options(self->conn, MYSQL_OPT_NONBLOCK, 0);
apply_options(self);
self->state = STATE_CONNECTING;
status = mysql_real_connect_start(&self->op_conn_ret, self->conn,
self->host, self->user, self->password, self->database,
self->port, self->unix_socket, self->client_flags);
if (status == 0) {
on_connect_done(self);
} else {
self->fd = mysql_get_socket(self->conn);
if (self->fd < 0) {
mysql_close(self->conn);
self->conn = NULL;
self->state = STATE_IDLE;
croak("mysql_get_socket returned invalid fd");
}
init_io_watchers(self);
update_watchers(self, status);
}
}
MODULE = EV::MariaDB PACKAGE = EV::MariaDB
BOOT:
{
I_EV_API("EV::MariaDB");
call_atexit(drain_freelists, NULL);
}
EV::MariaDB
_new(char *class, EV::Loop loop)
CODE:
{
PERL_UNUSED_VAR(class);
Newxz(RETVAL, 1, ev_mariadb_t);
RETVAL->magic = EV_MARIADB_MAGIC;
RETVAL->loop = loop;
RETVAL->loop_sv = SvREFCNT_inc(ST(1)); /* keep the EV::Loop object alive */
RETVAL->fd = -1;
RETVAL->state = STATE_IDLE;
ngx_queue_init(&RETVAL->cb_queue);
ngx_queue_init(&RETVAL->send_queue);
ev_init(&RETVAL->timer, timer_cb);
RETVAL->timer.data = (void *)RETVAL;
}
OUTPUT:
RETVAL
void
DESTROY(EV::MariaDB self)
CODE:
{
if (self->magic != EV_MARIADB_MAGIC)
return;
self->magic = EV_MARIADB_FREED;
stop_reading(self);
stop_writing(self);
stop_timer(self);
if (PL_dirty) {
/* global destruction â free C resources only; skip SvREFCNT_dec
to avoid cascading destructors in torn-down interpreter */
int is_fork = IS_FORKED(self);
while (!ngx_queue_empty(&self->send_queue)) {
ngx_queue_t *q = ngx_queue_head(&self->send_queue);
ev_mariadb_send_t *s = ngx_queue_data(q, ev_mariadb_send_t, queue);
ngx_queue_remove(q);
Safefree(s->sql);
Safefree(s);
}
while (!ngx_queue_empty(&self->cb_queue)) {
ngx_queue_t *q = ngx_queue_head(&self->cb_queue);
ev_mariadb_cb_t *cbt = ngx_queue_data(q, ev_mariadb_cb_t, queue);
ngx_queue_remove(q);
Safefree(cbt);
}
if (self->op_data_ptr) Safefree(self->op_data_ptr);
Safefree(self->pending_user);
Safefree(self->pending_password);
Safefree(self->pending_database);
Safefree(self->pending_charset);
self->stream_cb = NULL;
/* skip loop_sv dec: global destruction, like the other SVs here */
{
ev_mariadb_stmt_t *ctx = self->stmt_list;
while (ctx) {
ev_mariadb_stmt_t *next = ctx->next;
free_stmt_bind_params(ctx);
if (!is_fork && ctx->stmt) {
if (ctx->stmt == self->op_stmt) self->op_stmt = NULL;
mysql_stmt_close(ctx->stmt);
}
Safefree(ctx);
ctx = next;
}
( run in 0.925 second using v1.01-cache-2.11-cpan-14f38c9f855 )