static PyObject * set_common(pycbc_Bucket *self, PyObject *args, PyObject *kwargs, const lcb_storage_t operation, int argopts) { int rv; Py_ssize_t ncmds = 0; PyObject *ttl_O = NULL; PyObject *dict = NULL; PyObject *key; PyObject *value; pycbc_seqtype_t seqtype; struct pycbc_common_vars cv = PYCBC_COMMON_VARS_STATIC_INIT; struct storecmd_vars scv = { 0 }; char persist_to = 0, replicate_to = 0; static char *kwlist_multi[] = { "kv", "ttl", "format", "persist_to", "replicate_to", NULL }; static char *kwlist_single[] = { "key", "value", "cas", "ttl", "format", "persist_to", "replicate_to", NULL }; scv.operation = operation; if (argopts & PYCBC_ARGOPT_MULTI) { rv = PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOBB", kwlist_multi, &dict, &ttl_O, &scv.flagsobj, &persist_to, &replicate_to); } else { rv = PyArg_ParseTupleAndKeywords(args, kwargs, "OO|KOOBB", kwlist_single, &key, &value, &scv.single_cas, &ttl_O, &scv.flagsobj, &persist_to, &replicate_to); } if (!rv) { PYCBC_EXC_WRAP(PYCBC_EXC_ARGUMENTS, 0, "couldn't parse arguments"); return NULL; } rv = pycbc_get_ttl(ttl_O, &scv.ttl, 1); if (rv < 0) { return NULL; } if (argopts & PYCBC_ARGOPT_MULTI) { rv = pycbc_oputil_check_sequence(dict, 0, &ncmds, &seqtype); if (rv < 0) { return NULL; } } else { ncmds = 1; } if (operation == LCB_APPEND || operation == LCB_PREPEND) { rv = handle_append_flags(self, &scv.flagsobj); if (rv < 0) { return NULL; } } else if (scv.flagsobj == NULL || scv.flagsobj == Py_None) { scv.flagsobj = self->dfl_fmt; } rv = pycbc_common_vars_init(&cv, self, argopts, ncmds, 1); if (rv < 0) { return NULL; } rv = pycbc_handle_durability_args(self, &cv.mres->dur, persist_to, replicate_to); if (rv == 1) { cv.mres->mropts |= PYCBC_MRES_F_DURABILITY; } else if (rv == -1) { goto GT_DONE; } if (argopts & PYCBC_ARGOPT_MULTI) { rv = pycbc_oputil_iter_multi(self, seqtype, dict, &cv, 0, handle_single_kv, &scv); } else { rv = handle_single_kv(self, &cv, 0, key, value, NULL, NULL, &scv); } if (rv < 0) { goto GT_DONE; } if (-1 == pycbc_common_vars_wait(&cv, self)) { goto GT_DONE; } GT_DONE: pycbc_common_vars_finalize(&cv, self); return cv.ret; }
static PyObject * keyop_common(pycbc_Bucket *self, PyObject *args, PyObject *kwargs, int optype, int argopts) { int rv; Py_ssize_t ncmds = 0; pycbc_seqtype_t seqtype; PyObject *casobj = NULL; PyObject *is_quiet = NULL; PyObject *kobj = NULL; char persist_to = 0, replicate_to = 0; struct pycbc_common_vars cv = PYCBC_COMMON_VARS_STATIC_INIT; static char *kwlist[] = { "keys", "cas", "quiet", "persist_to", "replicate_to", NULL }; rv = PyArg_ParseTupleAndKeywords(args, kwargs, "O|OOBB", kwlist, &kobj, &casobj, &is_quiet, &persist_to, &replicate_to); 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, self, argopts, ncmds, 0); if (rv < 0) { return NULL; } if (argopts & PYCBC_ARGOPT_MULTI) { rv = pycbc_oputil_iter_multi(self, seqtype, kobj, &cv, optype, handle_single_keyop, NULL); } else { rv = handle_single_keyop(self, &cv, optype, kobj, casobj, NULL, NULL, NULL); } if (rv < 0) { goto GT_DONE; } if (optype == PYCBC_CMD_DELETE) { rv = pycbc_handle_durability_args(self, &cv.mres->dur, persist_to, replicate_to); if (rv == 1) { cv.mres->mropts |= PYCBC_MRES_F_DURABILITY; } else if (rv == -1) { goto GT_DONE; } if (pycbc_maybe_set_quiet(cv.mres, is_quiet) == -1) { goto GT_DONE; } } if (-1 == pycbc_common_vars_wait(&cv, self)) { goto GT_DONE; } GT_DONE: pycbc_common_vars_finalize(&cv, self); return cv.ret; }
PyObject * pycbc_Bucket_endure_multi(pycbc_Bucket *self, PyObject *args, PyObject *kwargs) { int rv; Py_ssize_t ncmds; pycbc_seqtype_t seqtype; char persist_to = 0, replicate_to = 0; lcb_durability_opts_t dopts = { 0 }; PyObject *keys; PyObject *is_delete_O = Py_False; lcb_error_t err; float timeout = 0.0; float interval = 0.0; struct pycbc_common_vars cv = PYCBC_COMMON_VARS_STATIC_INIT; static char *kwlist[] = { "keys", "persist_to", "replicate_to", "check_removed", "timeout", "interval", NULL }; rv = PyArg_ParseTupleAndKeywords(args, kwargs, "OBB|Off", kwlist, &keys, &persist_to, &replicate_to, &is_delete_O, &timeout, &interval); if (!rv) { PYCBC_EXCTHROW_ARGS(); return NULL; } rv = pycbc_oputil_check_sequence(keys, 1, &ncmds, &seqtype); if (rv < 0) { return NULL; } rv = pycbc_common_vars_init(&cv, self, PYCBC_ARGOPT_MULTI, ncmds, 0); if (rv < 0) { return NULL; } dopts.v.v0.cap_max = persist_to < 0 || replicate_to < 0; dopts.v.v0.check_delete = is_delete_O && PyObject_IsTrue(is_delete_O); dopts.v.v0.timeout = (lcb_uint32_t)(timeout * 1000000.0); dopts.v.v0.interval = (lcb_uint32_t)(interval * 1000000.0); dopts.v.v0.persist_to = persist_to; dopts.v.v0.replicate_to = replicate_to; cv.mctx = lcb_endure3_ctxnew(self->instance, &dopts, &err); if (cv.mctx == NULL) { PYCBC_EXCTHROW_SCHED(err); goto GT_DONE; } rv = pycbc_oputil_iter_multi(self, seqtype, keys, &cv, PYCBC_CMD_ENDURE, handle_single_keyop, NULL); if (rv < 0) { goto GT_DONE; } if (-1 == pycbc_common_vars_wait(&cv, self)) { goto GT_DONE; } GT_DONE: pycbc_common_vars_finalize(&cv, self); return cv.ret; }
PyObject * arithmetic_common(pycbc_Bucket *self, PyObject *args, PyObject *kwargs, int optype, int argopts) { int rv; Py_ssize_t ncmds; struct arithmetic_common_vars global_params = { 0 }; pycbc_seqtype_t seqtype; PyObject *all_initial_O = NULL; PyObject *all_ttl_O = NULL; PyObject *collection; lcb_error_t err; struct pycbc_common_vars cv = PYCBC_COMMON_VARS_STATIC_INIT; static char *kwlist[] = { "keys", "delta", "initial", "ttl", NULL }; global_params.delta = 1; rv = PyArg_ParseTupleAndKeywords(args, kwargs, "O|LOO", kwlist, &collection, &global_params.delta, &all_initial_O, &all_ttl_O); if (!rv) { PYCBC_EXCTHROW_ARGS(); return NULL; } rv = pycbc_get_ttl(all_ttl_O, &global_params.ttl, 1); if (rv < 0) { return NULL; } if (argopts & PYCBC_ARGOPT_MULTI) { rv = pycbc_oputil_check_sequence(collection, 1, &ncmds, &seqtype); if (rv < 0) { return NULL; } } else { ncmds = 1; } if (all_initial_O && PyNumber_Check(all_initial_O)) { global_params.create = 1; global_params.initial = pycbc_IntAsULL(all_initial_O); } rv = pycbc_common_vars_init(&cv, self, argopts, ncmds, sizeof(lcb_arithmetic_cmd_t), 0); if (argopts & PYCBC_ARGOPT_MULTI) { rv = pycbc_oputil_iter_multi(self, seqtype, collection, &cv, optype, handle_single_arith, &global_params); } else { rv = handle_single_arith(self, &cv, optype, collection, NULL, NULL, NULL, 0, &global_params); } if (rv < 0) { goto GT_DONE; } err = lcb_arithmetic(self->instance, cv.mres, ncmds, cv.cmdlist.arith); if (err != LCB_SUCCESS) { PYCBC_EXCTHROW_SCHED(err); goto GT_DONE; } if (-1 == pycbc_common_vars_wait(&cv, self)) { goto GT_DONE; } GT_DONE: pycbc_common_vars_finalize(&cv, self); return cv.ret; }