static int get_common_objects(PyObject *cookie, const void *key, size_t nkey, lcb_error_t err, pycbc_ConnectionObject **conn, pycbc_ResultBaseObject **res, int restype, pycbc_MultiResultObject **mres) { PyObject *hkey; int rv; assert(Py_TYPE(cookie) == &pycbc_MultiResultType); *mres = (pycbc_MultiResultObject*)cookie; *conn = (*mres)->parent; CB_THR_END(*conn); rv = pycbc_tc_decode_key(*conn, key, nkey, &hkey); if (rv < 0) { push_fatal_error(*mres); return -1; } /** * Now, get/set the result object */ if (restype == RESTYPE_BASE) { *res = (pycbc_ResultBaseObject*)pycbc_result_new(*conn); } else if (restype == RESTYPE_OPERATION) { *res = (pycbc_ResultBaseObject*)pycbc_opresult_new(*conn); } else if (restype == RESTYPE_VALUE) { *res = (pycbc_ResultBaseObject*)pycbc_valresult_new(*conn); } else { abort(); } assert(PyDict_Contains((PyObject*)*mres, hkey) == 0); PyDict_SetItem((PyObject*)*mres, hkey, (PyObject*)*res); Py_DECREF(*res); (*res)->key = hkey; (*res)->rc = err; if (err != LCB_SUCCESS) { (*mres)->all_ok = 0; } return 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; }
/** * Call this function for each callback. Note that even if this function * returns nonzero, CB_THR_BEGIN() must still be called, and the `conn` * and `mres` out parameters are considered valid * @param resp base response object * @param[out] conn the bucket object * @param[out] res the result object for the individual operation * @param restype What type should `res` be if it needs to be created * @param[out] mres the context for the current operation * @return 0 if operation processing may proceed, nonzero if operation * processing has completed. In both cases the `conn` and `mres` paramters * are valid, however. */ static int get_common_objects(const lcb_RESPBASE *resp, pycbc_Bucket **conn, pycbc_Result **res, int restype, pycbc_MultiResult **mres) { PyObject *hkey; PyObject *mrdict; int rv; pycbc_assert(pycbc_multiresult_check(resp->cookie)); *mres = (pycbc_MultiResult*)resp->cookie; *conn = (*mres)->parent; CB_THR_END(*conn); rv = pycbc_tc_decode_key(*conn, resp->key, resp->nkey, &hkey); if (rv < 0) { pycbc_multiresult_adderr(*mres); return -1; } mrdict = pycbc_multiresult_dict(*mres); *res = (pycbc_Result*)PyDict_GetItem(mrdict, hkey); if (*res) { int exists_ok = (restype & RESTYPE_EXISTS_OK) || ( (*mres)->mropts & PYCBC_MRES_F_UALLOCED); if (!exists_ok) { if ((*conn)->flags & PYCBC_CONN_F_WARNEXPLICIT) { PyErr_WarnExplicit(PyExc_RuntimeWarning, "Found duplicate key", __FILE__, __LINE__, "couchbase._libcouchbase", NULL); } else { PyErr_WarnEx(PyExc_RuntimeWarning, "Found duplicate key", 1); } /** * We need to destroy the existing object and re-create it. */ PyDict_DelItem(mrdict, hkey); *res = NULL; } else { Py_XDECREF(hkey); } } if (*res == NULL) { /* Now, get/set the result object */ if ( (*mres)->mropts & PYCBC_MRES_F_ITEMS) { *res = (pycbc_Result*)pycbc_item_new(*conn); } else if (restype & RESTYPE_BASE) { *res = (pycbc_Result*)pycbc_result_new(*conn); } else if (restype & RESTYPE_OPERATION) { *res = (pycbc_Result*)pycbc_opresult_new(*conn); } else if (restype & RESTYPE_VALUE) { *res = (pycbc_Result*)pycbc_valresult_new(*conn); } else { abort(); } PyDict_SetItem(mrdict, hkey, (PyObject*)*res); (*res)->key = hkey; Py_DECREF(*res); } if (resp->rc) { (*res)->rc = resp->rc; } if (resp->rc != LCB_SUCCESS) { (*mres)->all_ok = 0; } return 0; }
static int get_common_objects(PyObject *cookie, const void *key, size_t nkey, lcb_error_t err, pycbc_Connection **conn, pycbc_Result **res, int restype, pycbc_MultiResult **mres) { PyObject *hkey; int rv; pycbc_assert(Py_TYPE(cookie) == &pycbc_MultiResultType); *mres = (pycbc_MultiResult*)cookie; *conn = (*mres)->parent; if (!(restype & RESTYPE_VARCOUNT)) { maybe_breakout(*conn); } CB_THR_END(*conn); rv = pycbc_tc_decode_key(*conn, key, nkey, &hkey); if (rv < 0) { push_fatal_error(*mres); return -1; } *res = (pycbc_Result*)PyDict_GetItem((PyObject*)*mres, hkey); if (*res) { int exists_ok = (restype & RESTYPE_EXISTS_OK) || ( (*mres)->mropts & PYCBC_MRES_F_UALLOCED); if (!exists_ok) { if ((*conn)->flags & PYCBC_CONN_F_WARNEXPLICIT) { PyErr_WarnExplicit(PyExc_RuntimeWarning, "Found duplicate key", __FILE__, __LINE__, "couchbase._libcouchbase", NULL); } else { PyErr_WarnEx(PyExc_RuntimeWarning, "Found duplicate key", 1); } /** * We need to destroy the existing object and re-create it. */ PyDict_DelItem((PyObject*)*mres, hkey); *res = NULL; } else { Py_XDECREF(hkey); } } if (*res == NULL) { /** * Now, get/set the result object */ if ( (*mres)->mropts & PYCBC_MRES_F_ITEMS) { *res = (pycbc_Result*)pycbc_item_new(*conn); } else if (restype & RESTYPE_BASE) { *res = (pycbc_Result*)pycbc_result_new(*conn); } else if (restype & RESTYPE_OPERATION) { *res = (pycbc_Result*)pycbc_opresult_new(*conn); } else if (restype & RESTYPE_VALUE) { *res = (pycbc_Result*)pycbc_valresult_new(*conn); } else { abort(); } PyDict_SetItem((PyObject*)*mres, hkey, (PyObject*)*res); (*res)->key = hkey; Py_DECREF(*res); } if (err) { (*res)->rc = err; } if (err != LCB_SUCCESS) { (*mres)->all_ok = 0; } return 0; }