Пример #1
0
static void
get_callback(lcb_t instance,
             const void *cookie,
             lcb_error_t err,
             const lcb_get_resp_t *resp)
{

    int rv;
    pycbc_Connection *conn = NULL;
    pycbc_ValueResult *res = NULL;
    pycbc_MultiResult *mres = NULL;
    lcb_uint32_t eflags;

    rv = get_common_objects((PyObject*)cookie,
                            resp->v.v0.key,
                            resp->v.v0.nkey,
                            err,
                            &conn,
                            (pycbc_Result**)&res,
                            RESTYPE_VALUE,
                            &mres);

    if (rv < 0) {
        CB_THR_BEGIN(conn);
        return;
    }

    res->flags = resp->v.v0.flags;
    res->cas = resp->v.v0.cas;

    maybe_push_operr(mres, (pycbc_Result*)res, err, 1);

    if (err != LCB_SUCCESS) {
        CB_THR_BEGIN(conn);
        return;
    }

    if (mres->mropts & PYCBC_MRES_F_FORCEBYTES) {
        eflags = PYCBC_FMT_BYTES;
    } else {
        eflags = resp->v.v0.flags;
    }

    rv = pycbc_tc_decode_value(mres->parent,
                               resp->v.v0.bytes,
                               resp->v.v0.nbytes,
                               eflags,
                               &res->value);
    if (rv < 0) {
        push_fatal_error(mres);
    }

    CB_THR_BEGIN(conn);
    (void)instance;
}
Пример #2
0
static void
value_callback(lcb_t instance, int cbtype, const lcb_RESPBASE *resp)
{
    int rv;
    pycbc_Bucket *conn = NULL;
    pycbc_ValueResult *res = NULL;
    pycbc_MultiResult *mres = NULL;

    rv = get_common_objects(resp, &conn, (pycbc_Result**)&res, RESTYPE_VALUE,
        &mres);

    if (rv < 0) {
        goto GT_DONE;
    }

    if (resp->rc == LCB_SUCCESS) {
        res->cas = resp->cas;
    } else {
        maybe_push_operr(mres, (pycbc_Result*)res, resp->rc,
            cbtype != LCB_CALLBACK_COUNTER);
        goto GT_DONE;
    }

    if (cbtype == LCB_CALLBACK_GET || cbtype == LCB_CALLBACK_GETREPLICA) {
        const lcb_RESPGET *gresp = (const lcb_RESPGET *)resp;
        lcb_U32 eflags;

        res->flags = gresp->itmflags;
        if (mres->mropts & PYCBC_MRES_F_FORCEBYTES) {
            eflags = PYCBC_FMT_BYTES;
        } else {
            eflags = gresp->itmflags;
        }

        rv = pycbc_tc_decode_value(mres->parent, gresp->value, gresp->nvalue,
            eflags, &res->value);
        if (rv < 0) {
            pycbc_multiresult_adderr(mres);
        }
    } else if (cbtype == LCB_CALLBACK_COUNTER) {
        const lcb_RESPCOUNTER *cresp = (const lcb_RESPCOUNTER *)resp;
        res->value = pycbc_IntFromULL(cresp->value);
    }

    GT_DONE:
    operation_completed(conn, mres);
    CB_THR_BEGIN(conn);
    (void)instance;
}
Пример #3
0
static int
parse_row_json(pycbc_Bucket *bucket, pycbc_ViewResult *vres,
               pycbc_MultiResult *mres, const lcb_RESPVIEWQUERY *resp)
{
    PyObject *dd = PyDict_New();
    PyObject *docid;
    int is_ok, rv = 0;

    if (resp->ndocid) {
        rv = pycbc_tc_decode_key(bucket, resp->docid, resp->ndocid, &docid);
        if (rv == -1) {
            goto GT_DONE;
        } else {
            PyDict_SetItem(dd, pycbc_helpers.vkey_id, docid);
            Py_XDECREF(docid);
        }
    }

    #define ADD_FIELD(helpname, fbase) \
    add_view_field(dd, pycbc_helpers.helpname, resp->fbase, resp->n##fbase)

    is_ok = ADD_FIELD(vkey_key, key) == 0 &&
            ADD_FIELD(vkey_value, value) == 0 &&
            ADD_FIELD(vkey_geo, geometry) == 0;

    #undef ADD_FIELD

    if (!is_ok) {
        rv = -1;
        goto GT_DONE;
    } else {
        PyList_Append(vres->rows, dd);
    }

    if (resp->docresp) {
        /* include_docs */
        const lcb_RESPGET *rg = resp->docresp;
        pycbc_ValueResult *docres = pycbc_valresult_new(bucket);

        docres->key = docid;
        Py_INCREF(docid);
        docres->rc = rg->rc;

        if (rg->rc == LCB_SUCCESS) {
            docres->cas = rg->cas;
            docres->flags = rg->itmflags;
            rv = pycbc_tc_decode_value(
                    bucket, rg->value, rg->nvalue, rg->itmflags, &docres->value);
            if (rv != 0) {
                pycbc_multiresult_adderr(mres);
            }
        }

        PyDict_SetItem(dd, pycbc_helpers.vkey_docresp, (PyObject*)docres);
        Py_DECREF(docres);
    }

    GT_DONE:
    Py_DECREF(dd);
    return rv;
}