Couchbase
view release on metacpan or search on metacpan
#include "perl-couchbase.h"
#include <libcouchbase/views.h>
#include <libcouchbase/n1ql.h>
static void
rowreq_init_common(PLCB_t *parent, AV *req)
{
SV *selfref;
av_fill(req, PLCB_VHIDX_MAX);
av_store(req, PLCB_VHIDX_ROWBUF, newRV_noinc((SV *)newAV()));
av_store(req, PLCB_VHIDX_RAWROWS, newRV_noinc((SV *)newAV()));
av_store(req, PLCB_VHIDX_PARENT, newRV_inc(parent->selfobj));
selfref = newRV_inc((SV*)req);
sv_rvweaken(selfref);
av_store(req, PLCB_VHIDX_SELFREF, selfref);
}
static PLCB_t *
parent_from_req(AV *req)
{
SV **pp = av_fetch(req, PLCB_VHIDX_PARENT, 0);
return NUM2PTR(PLCB_t*,SvUV(SvRV(*pp)));
}
/* Handles the row, adding it into the internal structure */
static void
invoke_row(AV *req, SV *reqrv, SV *rowsrv)
{
SV *meth;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
/* First arg */
XPUSHs(reqrv);
meth = *av_fetch(req, PLCB_VHIDX_PRIVCB, 0);
if (rowsrv) {
XPUSHs(rowsrv);
}
PUTBACK;
call_sv(meth, G_DISCARD|G_EVAL);
SPAGAIN;
if (SvTRUE(ERRSV)) {
warn("Got error in %s", SvPV_nolen(ERRSV));
}
if (rowsrv) {
av_clear((AV *)SvRV(rowsrv));
}
FREETMPS;
LEAVE;
}
/* Wraps the buf:length pair as an SV */
static SV *
sv_from_rowdata(const char *s, size_t n)
{
if (s && n) {
SV *ret = newSVpvn(s, n);
SvUTF8_on(ret);
return ret;
} else {
return SvREFCNT_inc(&PL_sv_undef);
}
}
static SV*
make_views_row(PLCB_t *parent, const lcb_RESPVIEWQUERY *resp)
( run in 1.917 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )