Redis-Fast

 view release on metacpan or  search on metacpan

src/Redis__Fast.xs  view on Meta::CPAN

    if(status != REDIS_OK) {
        // Connection Error!!
        // Redis context will close automatically
        self->ac = NULL;
    } else {
        self->is_connected = 1;
    }
}

static void Redis__Fast_disconnect_cb(redisAsyncContext* c, int status) {
    Redis__Fast self = (Redis__Fast)c->data;
    PERL_UNUSED_VAR(status);
    DEBUG_MSG("disconnected status = %d", status);
    self->ac = NULL;
}

static redisAsyncContext* __build_sock(pTHX_ Redis__Fast self)
{
    redisAsyncContext *ac;
    double timeout;
    int res;

    DEBUG_MSG("%s", "start");

    if(self->on_build_sock) {
        dSP;

        ENTER;
        SAVETMPS;

        PUSHMARK(SP);
        call_sv(self->on_build_sock, G_DISCARD | G_NOARGS);

        FREETMPS;
        LEAVE;
    }

    if(self->path) {
        ac = redisAsyncConnectUnix(self->path);
    } else {
        ac = redisAsyncConnect(self->hostname, self->port);
    }

    if(ac == NULL) {
        DEBUG_MSG("%s", "allocation error");
        return NULL;
    }
    if(ac->err) {
        DEBUG_MSG("connection error: %s", ac->errstr);
        redisAsyncFree(ac);
        return NULL;
    }

    if(self->ssl){
        redisSSLContext* ssl_context;
        redisSSLContextError ssl_error = REDIS_SSL_CTX_NONE;
        redisSSLOptions options = {
            .cacert_filename      = NULL,
            .capath               = NULL,
            .cert_filename        = NULL,
            .private_key_filename = NULL,
            .server_name          = self->hostname,
            .verify_mode          = self->ssl_verify_mode,
        };
        ssl_context = redisCreateSSLContextWithOptions(&options, &ssl_error);

        if(ssl_context == NULL || ssl_error != REDIS_SSL_CTX_NONE) {
            DEBUG_MSG("ssl context error: %s", redisSSLContextGetError(ssl_error));
            redisAsyncFree(ac);
            redisFreeSSLContext(ssl_context);
            return NULL;
        }

        if (redisInitiateSSLWithContext(&ac->c, ssl_context) != REDIS_OK) {
            DEBUG_MSG("ssl connection error: %s", ac->c.errstr);
            redisAsyncFree(ac);
            redisFreeSSLContext(ssl_context);
            return NULL;
        }
        DEBUG_MSG("%s", "ssl connection setup");
    }

    ac->data = (void*)self;
    self->ac = ac;
    self->is_connected = 0;

    Attach(ac);
    redisAsyncSetConnectCallback(ac, (redisConnectCallback*)Redis__Fast_connect_cb);
    redisAsyncSetDisconnectCallback(ac, (redisDisconnectCallback*)Redis__Fast_disconnect_cb);

    // wait to connect...
    timeout = -1;
    if(self->cnx_timeout) {
        timeout = self->cnx_timeout;
    }
    while(!self->is_connected) {
        res = wait_for_event(aTHX_ self, timeout, timeout);
        if(self->ac == NULL) {
            // set is_connected flag to reconnect.
            // see https://github.com/shogo82148/Redis-Fast/issues/73
            self->is_connected = 1;

            return NULL;
        }
        if(res != WAIT_FOR_EVENT_OK) {
            DEBUG_MSG("error: %d", res);

            // free the redis context
            redisAsyncFree(self->ac);
            _wait_all_responses(aTHX_ self);
            self->ac = NULL;

            // set is_connected flag to reconnect.
            // see https://github.com/shogo82148/Redis-Fast/issues/73
            self->is_connected = 1;

            return NULL;
        }
    }
    if(self->on_connect){
        dSP;



( run in 0.939 second using v1.01-cache-2.11-cpan-39bf76dae61 )