static void php_couchbase_complete_callback(lcb_http_request_t request, lcb_t instance, const void *cookie, lcb_error_t error, const lcb_http_resp_t *resp) { php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; php_couchbase_htinfo *hti; pcbc_stop_loop(ctx->res); if (resp->version != 0) { ctx->extended_value = NULL; ctx->res->rc = LCB_ERROR; return; } /** We have one extra byte in 'data' */ hti = emalloc(sizeof(*hti) + resp->v.v0.nbytes); hti->ndata = resp->v.v0.nbytes; if (hti->ndata) { memcpy(hti->data, resp->v.v0.bytes, hti->ndata); } hti->data[hti->ndata] = '\0'; ctx->res->rc = error; ctx->extended_value = hti; hti->htstatus = resp->v.v0.status; }
static void php_couchbase_store_callback(lcb_t instance, const void *cookie, lcb_storage_t operation, lcb_error_t error, const lcb_store_resp_t *resp) { php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; const void *key; size_t nkey; uint64_t cas; if (--ctx->res->seqno == 0) { pcbc_stop_loop(ctx->res); } if (resp->version != 0) { ctx->res->rc = LCB_ERROR; return; } key = resp->v.v0.key; nkey = resp->v.v0.nkey; cas = resp->v.v0.cas; ctx->res->rc = error; if (error != LCB_SUCCESS && error != LCB_AUTH_CONTINUE) { if (IS_ARRAY == Z_TYPE_P(ctx->rv)) { zval *rv; char *string_key = emalloc(nkey + 1); memcpy(string_key, key, nkey); string_key[nkey] = '\0'; MAKE_STD_ZVAL(rv); ZVAL_FALSE(rv); zend_hash_update(Z_ARRVAL_P(ctx->rv), string_key, nkey + 1, (void **)&rv, sizeof(zval *), NULL); efree(string_key); } return; } if (IS_ARRAY == Z_TYPE_P(ctx->rv)) { zval *rv; char *string_key = emalloc(nkey + 1); memcpy(string_key, key, nkey); string_key[nkey] = '\0'; MAKE_STD_ZVAL(rv); Z_TYPE_P(rv) = IS_STRING; Z_STRLEN_P(rv) = spprintf(&(Z_STRVAL_P(rv)), 0, "%llu", cas); zend_hash_update(Z_ARRVAL_P(ctx->rv), string_key, nkey + 1, (void **)&rv, sizeof(zval *), NULL); efree(string_key); } else { Z_TYPE_P(ctx->rv) = IS_STRING; Z_STRLEN_P(ctx->rv) = spprintf(&(Z_STRVAL_P(ctx->rv)), 0, "%llu", cas); } }
/* {{{ static void php_couchbase_arithmetic_callback(...) */ static void php_couchbase_arithmetic_callback(lcb_t instance, const void *cookie, lcb_error_t error, const lcb_arithmetic_resp_t *resp) { php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; php_ignore_value(instance); if (--ctx->res->seqno == 0) { pcbc_stop_loop(ctx->res); } ctx->res->rc = error; if (LCB_SUCCESS != error) { return; } if (resp->version != 0) { ctx->res->rc = LCB_ERROR; return; } ZVAL_LONG(ctx->rv, resp->v.v0.value); }
/* {{{ static void php_couchbase_get_callback(...) */ static void php_couchbase_get_callback(lcb_t instance, const void *cookie, lcb_error_t error, const lcb_get_resp_t *resp) { zval *retval; php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; const void *key; size_t nkey; const void *bytes; size_t nbytes; uint32_t flags; uint64_t cas; TSRMLS_FETCH(); if (--ctx->res->seqno == 0) { pcbc_stop_loop(ctx->res); } if (resp->version != 0) { ctx->res->rc = LCB_ERROR; return; } key = resp->v.v0.key; nkey = resp->v.v0.nkey; bytes = resp->v.v0.bytes; nbytes = resp->v.v0.nbytes; flags = resp->v.v0.flags; cas = resp->v.v0.cas; ctx->res->rc = error; if (LCB_SUCCESS != error && LCB_KEY_ENOENT != error) { pcbc_stop_loop(ctx->res); return; } if (ctx->res->async) { /* get_delayed */ zval *k, *v; MAKE_STD_ZVAL(v); if (!php_couchbase_zval_from_payload(v, (char *)bytes, nbytes, flags, ctx->res->serializer, ctx->res->ignoreflags TSRMLS_CC)) { ctx->res->rc = LCB_ERROR; efree(v); return; } if (ctx->res->prefix_key_len && nkey) { if (!strncmp(key, ctx->res->prefix_key, ctx->res->prefix_key_len)) { nkey -= (ctx->res->prefix_key_len + 1); /* '_' */ key = estrndup(((const char *)key) + ctx->res->prefix_key_len + 1, nkey); } } MAKE_STD_ZVAL(retval); array_init(retval); zend_hash_next_index_insert(Z_ARRVAL_P(ctx->rv), (void **)&retval, sizeof(zval *), NULL); MAKE_STD_ZVAL(k); ZVAL_STRINGL(k, (char *)key, nkey, 1); zend_hash_add(Z_ARRVAL_P(retval), "key", sizeof("key"), (void **)&k, sizeof(zval *), NULL); zend_hash_add(Z_ARRVAL_P(retval), "value", sizeof("value"), (void **)&v, sizeof(zval *), NULL); if (ctx->flags) { zval *c; MAKE_STD_ZVAL(c); Z_TYPE_P(c) = IS_STRING; Z_STRLEN_P(c) = spprintf(&(Z_STRVAL_P(c)), 0, "%llu", cas); zend_hash_add(Z_ARRVAL_P(retval), "cas", sizeof("cas"), (void **)&c, sizeof(zval *), NULL); } if (ctx->res->prefix_key_len && nkey) { efree((void *)key); } } else { if (LCB_KEY_ENOENT == error) { return; } if (IS_ARRAY == Z_TYPE_P(ctx->rv)) { /* multi get */ zval *v; char *key_string = NULL; MAKE_STD_ZVAL(v); if (!php_couchbase_zval_from_payload(v, (char *)bytes, nbytes, flags, ctx->res->serializer, ctx->res->ignoreflags TSRMLS_CC)) { ctx->res->rc = LCB_ERROR; efree(v); return; } if (ctx->res->prefix_key_len && nkey) { if (!strncmp(key, ctx->res->prefix_key, ctx->res->prefix_key_len)) { nkey -= (ctx->res->prefix_key_len + 1); key_string = estrndup(((const char *)key) + ctx->res->prefix_key_len + 1, nkey); } } else { key_string = emalloc(nkey + 1); memcpy(key_string, key, nkey); key_string[nkey] = '\0'; } zend_hash_update((Z_ARRVAL_P(ctx->rv)), (char *)key_string, nkey + 1, (void **)&v, sizeof(zval *), NULL); if (ctx->cas) { zval *c; MAKE_STD_ZVAL(c); Z_TYPE_P(c) = IS_STRING; Z_STRLEN_P(c) = spprintf(&(Z_STRVAL_P(c)), 0, "%llu", cas); zend_hash_add(Z_ARRVAL_P(ctx->cas), (char *)key_string, nkey + 1, (void **)&c, sizeof(zval *), NULL); } efree(key_string); } else { if (ctx->res->prefix_key_len && nkey) { if (!strncmp(key, ctx->res->prefix_key, ctx->res->prefix_key_len)) { nkey -= (ctx->res->prefix_key_len + 1); key = estrndup(((const char *)key) + ctx->res->prefix_key_len + 1, nkey); } } if (!php_couchbase_zval_from_payload(ctx->rv, (char *)bytes, nbytes, flags, ctx->res->serializer, ctx->res->ignoreflags TSRMLS_CC)) { if (ctx->res->prefix_key_len && nkey) { efree((void *)key); } ctx->res->rc = LCB_ERROR; return; } if (ctx->res->prefix_key_len && nkey) { efree((void *)key); } if (ctx->cas) { Z_TYPE_P(ctx->cas) = IS_STRING; Z_STRLEN_P(ctx->cas) = spprintf(&(Z_STRVAL_P(ctx->cas)), 0, "%llu", cas); } } } }