LIBCOUCHBASE_API lcb_error_t lcb_remove(lcb_t instance, const void *cookie, lcb_size_t num, const lcb_remove_cmd_t * const * items) { unsigned ii; mcreq_sched_enter(&instance->cmdq); for (ii = 0; ii < num; ii++) { lcb_error_t err; const lcb_remove_cmd_t *src = items[ii]; lcb_CMDREMOVE dst; memset(&dst, 0, sizeof(dst)); dst.key.contig.bytes = src->v.v0.key; dst.key.contig.nbytes = src->v.v0.nkey; dst.hashkey.contig.bytes = src->v.v0.hashkey; dst.hashkey.contig.nbytes = src->v.v0.nhashkey; dst.options.cas = src->v.v0.cas; err = lcb_remove3(instance, cookie, &dst); if (err != LCB_SUCCESS) { mcreq_sched_fail(&instance->cmdq); return err; } } mcreq_sched_leave(&instance->cmdq, 1); SYNCMODE_INTERCEPT(instance) }
// remove($id {, $cas, $groupid}) : MetaDoc PHP_METHOD(Bucket, remove) { bucket_object *data = PCBC_PHP_THISOBJ(); int ii, ncmds, nscheduled; pcbc_pp_state pp_state; pcbc_pp_id id; opcookie *cookie; zval *zcas, *zgroupid; lcb_error_t err; // Note that groupid is experimental here and should not be used. if (pcbc_pp_begin(ZEND_NUM_ARGS() TSRMLS_CC, &pp_state, "id||cas,groupid", &id, &zcas, &zgroupid) != SUCCESS) { throw_pcbc_exception("Invalid arguments.", LCB_EINVAL); RETURN_NULL(); } ncmds = pcbc_pp_keycount(&pp_state); cookie = opcookie_init(); nscheduled = 0; for (ii = 0; pcbc_pp_next(&pp_state); ++ii) { lcb_CMDREMOVE cmd = {0}; PCBC_CHECK_ZVAL_STRING(zcas, "cas must be a string"); PCBC_CHECK_ZVAL_STRING(zgroupid, "groupid must be a string"); LCB_CMD_SET_KEY(&cmd, id.str, id.len); if (zcas) { cmd.cas = cas_decode(zcas TSRMLS_CC); } if (zgroupid) { LCB_KREQ_SIMPLE(&cmd._hashkey, Z_STRVAL_P(zgroupid), Z_STRLEN_P(zgroupid)); } err = lcb_remove3(data->conn->lcb, cookie, &cmd); if (err != LCB_SUCCESS) { break; } nscheduled++; } pcbc_assert_number_of_commands("remove", nscheduled, ncmds); if (nscheduled) { lcb_wait(data->conn->lcb); err = proc_remove_results(data, return_value, cookie, pcbc_pp_ismapped(&pp_state) TSRMLS_CC); } opcookie_destroy(cookie); if (err != LCB_SUCCESS) { throw_lcb_exception(err); } }
SV* PLCB_op_remove(PLCB_t *object, plcb_SINGLEOP *opinfo) { lcb_CMDREMOVE rcmd = { 0 }; lcb_error_t err = LCB_SUCCESS; key_from_so(opinfo, &rcmd); PLCB_args_remove(object, opinfo, &rcmd); err = lcb_remove3(object->instance, opinfo->cookie, &rcmd); return plcb_opctx_return(opinfo, err); }
/** * This is called during each iteration of delete/unlock */ static int handle_single_keyop(pycbc_Bucket *self, struct pycbc_common_vars *cv, int optype, PyObject *curkey, PyObject *curval, PyObject *options, pycbc_Item *item, void *arg) { int rv; char *key; size_t nkey; lcb_U64 cas = 0; lcb_error_t err; union { lcb_CMDBASE base; lcb_CMDREMOVE rm; lcb_CMDUNLOCK unl; lcb_CMDENDURE endure; } ucmd; (void)options; (void)arg; memset(&ucmd, 0, sizeof ucmd); if ( (optype == PYCBC_CMD_UNLOCK || optype == PYCBC_CMD_ENDURE) && PYCBC_OPRES_CHECK(curkey)) { curval = curkey; curkey = ((pycbc_OperationResult*)curkey)->key; } rv = pycbc_tc_encode_key(self, &curkey, (void**)&key, &nkey); if (rv == -1) { return -1; } if (!nkey) { PYCBC_EXCTHROW_EMPTYKEY(); rv = -1; goto GT_DONE; } if (item) { cas = item->cas; } else if (curval) { if (PyDict_Check(curval)) { PyObject *cas_o = PyDict_GetItemString(curval, "cas"); if (!cas_o) { PyErr_Clear(); } cas = pycbc_IntAsULL(cas_o); } else if (PYCBC_OPRES_CHECK(curval)) { /* If we're passed a Result object, just extract its CAS */ cas = ((pycbc_OperationResult*)curval)->cas; } else if (PyNumber_Check(curval)) { cas = pycbc_IntAsULL(curval); } if (cas == (lcb_uint64_t)-1 && PyErr_Occurred()) { PyErr_Clear(); PYCBC_EXC_WRAP(PYCBC_EXC_ARGUMENTS, 0, "Invalid CAS specified"); return -1; } } LCB_CMD_SET_KEY(&ucmd.base, key, nkey); ucmd.base.cas = cas; if (optype == PYCBC_CMD_UNLOCK) { if (!cas) { PYCBC_EXC_WRAP(PYCBC_EXC_ARGUMENTS, 0, "CAS must be specified for unlock"); return -1; } err = lcb_unlock3(self->instance, cv->mres, &ucmd.unl); } else if (optype == PYCBC_CMD_ENDURE) { err = cv->mctx->addcmd(cv->mctx, &ucmd.base); } else { err = lcb_remove3(self->instance, cv->mres, &ucmd.rm); } if (err == LCB_SUCCESS) { rv = 0; } else { rv = -1; PYCBC_EXCTHROW_SCHED(err); } GT_DONE: Py_XDECREF(curkey); return rv; }