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); } } }
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 */ } }
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); }