lcb_error_t lcb_n1p_mutation_token(lcb_N1QLPARAMS *params, const lcb_MUTATION_TOKEN *sv) { size_t np; if (params->scanvec_type == SCANVEC_FULL) { return LCB_OPTIONS_CONFLICT; } params->consist_type = LCB_N1P_CONSISTENCY_RYOW; /* Reserve data: */ if (-1 == lcb_string_reserve(¶ms->scanvec, SCANVEC_BASE_SIZE)) { return LCB_CLIENT_ENOMEM; } if (!params->scanvec.nused) { lcb_string_append(¶ms->scanvec, "{", 1); } else { lcb_string_append(¶ms->scanvec, ",", 1); } np = sprintf(params->scanvec.base + params->scanvec.nused, SCANVEC_BASEFMT, sv->vbid_, (unsigned long long)sv->uuid_, (unsigned long long)sv->seqno_); lcb_string_added(¶ms->scanvec, np); params->scanvec_type = SCANVEC_PARTIAL; return LCB_SUCCESS; }
static int add_encstr(lcb_string *str, const char *s, size_t n) { /* Reserve data */ size_t n_added; if (-1 == lcb_string_reserve(str, n * 3)) { return -1; } n_added = lcb_formencode(s, n, str->base + str->nused); lcb_string_added(str, n_added); return 0; }
lcb_error_t lcb_n1p_mkcmd(lcb_N1QLPARAMS *params, lcb_CMDN1QL *cmd) { lcb_error_t err; /* Build the query */ if (!params->form.nused) { return LCB_EINVAL; /* Empty! */ } if ((err = finalize_field(params, ¶ms->posargs, "args", "]")) != LCB_SUCCESS) { return err; } if (params->scanvec.nused) { if (params->consist_type != LCB_N1P_CONSISTENCY_RYOW) { return LCB_OPTIONS_CONFLICT; } if ((err = finalize_field(params, ¶ms->scanvec, "scan_vector", "}")) != LCB_SUCCESS) { return err; } } if (params->consist_type) { if (-1 == lcb_string_reserve(¶ms->form, 15)) { return LCB_CLIENT_ENOMEM; } } if (params->consist_type == LCB_N1P_CONSISTENCY_RYOW) { if (!params->scanvec.nused) { return LCB_OPTIONS_CONFLICT; } else { lcb_n1p_setoptz(params, PARAM_CONSISTENT, "at_plus"); } } else if (params->consist_type == LCB_N1P_CONSISTENCY_REQUEST) { lcb_n1p_setoptz(params, PARAM_CONSISTENT, "request_plus"); } else if (params->consist_type == LCB_N1P_CONSISTENCY_STATMENT) { lcb_n1p_setoptz(params, PARAM_CONSISTENT, "statement_plus"); } else if (params->consist_type == LCB_N1P_CONSISTENCY_NONE) { } else { return LCB_EINVAL; } cmd->content_type = "application/x-www-form-urlencoded"; cmd->query = params->form.base; cmd->nquery = params->form.nused; return LCB_SUCCESS; }
lcb_error_t lcb_n1p_posparam(lcb_N1QLPARAMS *params, const char *value, size_t nvalue) { nvalue = get_strlen(value, nvalue); if (-1 == lcb_string_reserve(¶ms->posargs, nvalue+3)) { return LCB_CLIENT_ENOMEM; } if (!params->posargs.nused) { lcb_string_append(¶ms->posargs, "[", 1); } else { lcb_string_append(¶ms->posargs, ",", 1); } lcb_string_append(¶ms->posargs, value, nvalue); return LCB_SUCCESS; }
static int ensure_scratch(lcb_t instance, lcb_SIZE capacity) { if (!instance->scratch) { instance->scratch = calloc(1, sizeof(*instance->scratch)); if (!instance->scratch) { return 0; } lcb_string_init(instance->scratch); } else { lcb_string_clear(instance->scratch); } if (0 != lcb_string_reserve(instance->scratch, capacity)) { return 0; } return 1; }
static lcb_error_t obs_ctxadd(lcb_MULTICMD_CTX *mctx, const lcb_CMDBASE *cmdbase) { int vbid, srvix_dummy; unsigned ii; const lcb_CMDOBSERVE *cmd = (const lcb_CMDOBSERVE *)cmdbase; OBSERVECTX *ctx = CTX_FROM_MULTI(mctx); lcb_t instance = ctx->instance; mc_CMDQUEUE *cq = &instance->cmdq; lcb_U16 servers_s[4]; const lcb_U16 *servers; size_t nservers; if (LCB_KEYBUF_IS_EMPTY(&cmd->key)) { return LCB_EMPTY_KEY; } if (cq->config == NULL) { return LCB_CLIENT_ETMPFAIL; } if (LCBVB_DISTTYPE(LCBT_VBCONFIG(instance)) != LCBVB_DIST_VBUCKET) { return LCB_NOT_SUPPORTED; } mcreq_map_key(cq, &cmd->key, &cmd->_hashkey, 24, &vbid, &srvix_dummy); if (cmd->servers_) { servers = cmd->servers_; nservers = cmd->nservers_; } else { nservers = 0; servers = servers_s; /* Replicas are always < 4 */ for (ii = 0; ii < LCBVB_NREPLICAS(cq->config) + 1; ii++) { int ix = lcbvb_vbserver(cq->config, vbid, ii); if (ix < 0) { if (ii == 0) { return LCB_NO_MATCHING_SERVER; } else { continue; } } servers_s[nservers++] = ix; if (cmd->cmdflags & LCB_CMDOBSERVE_F_MASTER_ONLY) { break; /* Only a single server! */ } } } if (nservers == 0) { return LCB_NO_MATCHING_SERVER; } for (ii = 0; ii < nservers; ii++) { lcb_string *rr; lcb_U16 vb16, klen16; lcb_U16 ix = servers[ii]; lcb_assert(ix < ctx->nrequests); rr = ctx->requests + ix; if (0 != lcb_string_reserve(rr, 4 + cmd->key.contig.nbytes)) { return LCB_CLIENT_ENOMEM; } vb16 = htons((lcb_U16)vbid); klen16 = htons((lcb_U16)cmd->key.contig.nbytes); lcb_string_append(rr, &vb16, sizeof vb16); lcb_string_append(rr, &klen16, sizeof klen16); lcb_string_append(rr, cmd->key.contig.bytes, cmd->key.contig.nbytes); ctx->remaining++; } return LCB_SUCCESS; }
LIBCOUCHBASE_API const char * lcb_n1p_encode(lcb_N1QLPARAMS *params, lcb_error_t *err) { lcb_error_t err_s = LCB_SUCCESS; if (!err) { err = &err_s; } /* Build the query */ lcb_string_clear(¶ms->reqbuf); if (!params->form.nused) { *err = LCB_EINVAL; return NULL; } if (-1 == lcb_string_append( ¶ms->reqbuf, params->form.base, params->form.nused)) { *err = LCB_CLIENT_ENOMEM; return NULL; } if ((*err = finalize_field(params, ¶ms->posargs, "args", "]")) != LCB_SUCCESS) { return NULL; } if (params->scanvec.nused) { if (params->consist_type != LCB_N1P_CONSISTENCY_RYOW) { *err = LCB_OPTIONS_CONFLICT; return NULL; } if ((*err = finalize_field(params, ¶ms->scanvec, "scan_vector", "}")) != LCB_SUCCESS) { return NULL; } } if (params->consist_type) { if (-1 == lcb_string_reserve(¶ms->reqbuf, 15)) { *err = LCB_CLIENT_ENOMEM; return NULL; } } if (params->consist_type == LCB_N1P_CONSISTENCY_RYOW) { if (!params->scanvec.nused) { *err = LCB_OPTIONS_CONFLICT; return NULL; } else { set_reqbuf_optz(params, PARAM_CONSISTENT, "at_plus"); } } else if (params->consist_type == LCB_N1P_CONSISTENCY_REQUEST) { set_reqbuf_optz(params, PARAM_CONSISTENT, "request_plus"); } else if (params->consist_type == LCB_N1P_CONSISTENCY_STATEMENT) { set_reqbuf_optz(params, PARAM_CONSISTENT, "statement_plus"); } else if (params->consist_type == LCB_N1P_CONSISTENCY_NONE) { /* Nothing */ } else { *err = LCB_EINVAL; return NULL; } return params->reqbuf.base; }