static void
common_callback(lcb_t obj, const lcb_RESPBASE *resp,
    const char *meta, size_t nmeta, const lcb_RESPHTTP *htresp,
    int is_n1ql)
{
    AV *req = resp->cookie;
    SV *req_weakrv = *av_fetch(req, PLCB_VHIDX_SELFREF, 0);
    SV *rawrows_rv = *av_fetch(req, PLCB_VHIDX_RAWROWS, 0);
    AV *rawrows = (AV *)SvRV(rawrows_rv);

    PLCB_t *plobj = parent_from_req(req);

    plcb_views_waitdone(plobj);

    if (resp->rflags & LCB_RESP_F_FINAL) {
        av_store(req, PLCB_VHIDX_VHANDLE, SvREFCNT_inc(&PL_sv_undef));

        /* Flush any remaining rows.. */
        invoke_row(req, req_weakrv, rawrows_rv);

        av_store(req, PLCB_VHIDX_ISDONE, SvREFCNT_inc(&PL_sv_yes));
        av_store(req, PLCB_VHIDX_RC, newSViv(resp->rc));
        av_store(req, PLCB_VHIDX_META, sv_from_rowdata(meta, nmeta));

        if (htresp) {
            av_store(req, PLCB_VHIDX_HTCODE, newSViv(htresp->htstatus));
        }
        invoke_row(req, req_weakrv, NULL);
        SvREFCNT_dec(req);
    } else {
        SV *row;
        if (is_n1ql) {
            row = make_n1ql_row((const lcb_RESPN1QL *)resp);
        } else {
            row = make_views_row(plobj, (const lcb_RESPVIEWQUERY *)resp);
        }

        av_push(rawrows, row);
        if (av_len(rawrows) >= 1) {
            invoke_row(req, req_weakrv, rawrows_rv);
        }
    }

}
Exemple #2
0
static void
row_callback(lcbjsp_PARSER *parser, const lcbjsp_ROW *datum)
{
    N1QLREQ *req = parser->data;
    lcb_RESPN1QL resp = { 0 };

    if (datum->type == LCBJSP_TYPE_ROW) {
        resp.row = datum->row.iov_base;
        resp.nrow = datum->row.iov_len;
        invoke_row(req, &resp, 0);
    } else if (datum->type == LCBJSP_TYPE_ERROR) {
        req->lasterr = resp.rc = LCB_PROTOCOL_ERROR;
    } else if (datum->type == LCBJSP_TYPE_COMPLETE) {
        /* Nothing */
    }
}
Exemple #3
0
static void
destroy_req(N1QLREQ *req)
{
    if (req->htreq) {
        lcb_cancel_http_request(req->instance, req->htreq);
        req->htreq = NULL;
    }

    if (req->callback) {
        lcb_RESPN1QL resp = { 0 };
        invoke_row(req, &resp, 1);
    }

    if (req->parser) {
        lcbjsp_free(req->parser);
    }
    free(req);
}