PyObject * pycbc_Bucket__end_pipeline(pycbc_Bucket *self) { PyObject *rv; int ii; if (!self->pipeline_queue) { PYCBC_EXC_WRAP(PYCBC_EXC_PIPELINE, 0, "No pipeline in progress"); return NULL; } rv = self->pipeline_queue; if (!self->nremaining) { goto GT_DONE; } pycbc_oputil_wait_common(self); pycbc_assert(self->nremaining == 0); for (ii = 0; ii < PyList_GET_SIZE(self->pipeline_queue); ii++) { PyObject *retitem; pycbc_MultiResult *mres = (pycbc_MultiResult *)PyList_GET_ITEM(self->pipeline_queue, ii); if (pycbc_multiresult_maybe_raise(mres)) { rv = NULL; break; } /** Returns new reference to something */ retitem = pycbc_multiresult_get_result(mres); if (retitem != (PyObject *)mres) { PyList_SetItem(self->pipeline_queue, ii, retitem); } else { Py_DECREF(mres); } } GT_DONE: if (rv) { Py_INCREF(rv); pycbc_assert(rv == self->pipeline_queue); } Py_XDECREF(self->pipeline_queue); self->pipeline_queue = NULL; return rv; }
static PyObject * ViewResult_fetch(pycbc_ViewResult *self, PyObject *args) { PyObject *ret = NULL; pycbc_MultiResult *mres = NULL; pycbc_Bucket *bucket; int rv; rv = PyArg_ParseTuple(args, "O", &mres); if (!rv) { PYCBC_EXCTHROW_ARGS(); return NULL; } bucket = mres->parent; if (bucket->flags & PYCBC_CONN_F_ASYNC) { PYCBC_EXC_WRAP(PYCBC_EXC_INTERNAL, 0, "Cannot use fetch with async"); return NULL; } if (-1 == pycbc_oputil_conn_lock(bucket)) { return NULL; } if (!self->base.done) { pycbc_oputil_wait_common(bucket); } if (pycbc_multiresult_maybe_raise(mres)) { goto GT_DONE; } ret = self->rows ? self->rows : PyList_New(0); self->rows = PyList_New(0); GT_DONE: pycbc_oputil_conn_unlock(bucket); return ret; }
static PyObject * keyop_common(pycbc_Connection *self, PyObject *args, PyObject *kwargs, int optype, int argopts) { int rv; int ii; Py_ssize_t ncmds = 0; pycbc_seqtype_t seqtype; PyObject *casobj = NULL; PyObject *ret = NULL; PyObject *is_quiet = NULL; PyObject *kobj = NULL; pycbc_MultiResult *mres = NULL; lcb_error_t err; struct pycbc_common_vars cv = PYCBC_COMMON_VARS_STATIC_INIT; static char *kwlist[] = { "keys", "cas", "quiet", NULL }; rv = PyArg_ParseTupleAndKeywords(args, kwargs, "O|OO", kwlist, &kobj, &casobj, &is_quiet); if (!rv) { PYCBC_EXCTHROW_ARGS(); return NULL; } if (argopts & PYCBC_ARGOPT_MULTI) { rv = pycbc_oputil_check_sequence(kobj, 1, &ncmds, &seqtype); if (rv < 0) { return NULL; } if (casobj && PyObject_IsTrue(casobj)) { PYCBC_EXC_WRAP(PYCBC_EXC_ARGUMENTS, 0, "Can't pass CAS for multiple keys"); } } else { ncmds = 1; } rv = pycbc_common_vars_init(&cv, ncmds, sizeof(lcb_remove_cmd_t), 0); if (rv < 0) { return NULL; } if (argopts & PYCBC_ARGOPT_MULTI) { Py_ssize_t dictpos = 0; PyObject *curseq, *iter = NULL; curseq = pycbc_oputil_iter_prepare(seqtype, kobj, &iter, &dictpos); if (!curseq) { goto GT_DONE; } for (ii = 0; ii < ncmds; ii++) { PyObject *curkey = NULL, *curvalue = NULL; rv = pycbc_oputil_sequence_next(seqtype, curseq, &dictpos, ii, &curkey, &curvalue); if (rv < 0) { goto GT_ITER_DONE; } rv = handle_single_keyop(self, curkey, curvalue, ii, optype, &cv); Py_XDECREF(curkey); Py_XDECREF(curvalue); if (rv < 0) { goto GT_ITER_DONE; } } GT_ITER_DONE: Py_XDECREF(iter); if (rv < 0) { goto GT_DONE; } } else { rv = handle_single_keyop(self, kobj, casobj, 0, optype, &cv); if (rv < 0) { goto GT_DONE; } } mres = (pycbc_MultiResult*)pycbc_multiresult_new(self); if (optype == PYCBC_CMD_DELETE) { if (pycbc_maybe_set_quiet(mres, is_quiet) == -1) { goto GT_DONE; } err = lcb_remove(self->instance, mres, ncmds, cv.cmdlist.remove); } else { err = lcb_unlock(self->instance, mres, ncmds, cv.cmdlist.unlock); } if (err != LCB_SUCCESS) { PYCBC_EXCTHROW_SCHED(err); goto GT_DONE; } err = pycbc_oputil_wait_common(self); if (err != LCB_SUCCESS) { PYCBC_EXCTHROW_WAIT(err); goto GT_DONE; } if (!pycbc_multiresult_maybe_raise(mres)) { ret = (PyObject*)mres; } GT_DONE: pycbc_common_vars_free(&cv); ret = pycbc_make_retval(argopts, &ret, &mres); Py_XDECREF(mres); return ret; }