/* {{{ static void php_couchbase_storage_callback(...) */ static void php_couchbase_storage_callback(libcouchbase_t handle, const void *cookie, libcouchbase_storage_t operation, libcouchbase_error_t error, const void *key, size_t nkey, uint64_t cas) { php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; php_ignore_value(handle); php_ignore_value(operation); php_ignore_value(key); php_ignore_value(nkey); php_ignore_value(cas); if (--ctx->res->seqno == 0) { ctx->res->io->stop_event_loop(ctx->res->io); } ctx->exception = error; if (error != LIBCOUCHBASE_SUCCESS && error != LIBCOUCHBASE_AUTH_CONTINUE) { return; } ZVAL_DOUBLE(ctx->rv, cas); }
/* {{{ static void php_couchbase_flush_callback(...) */ static void php_couchbase_flush_callback(libcouchbase_t handle, const void* cookie, const char* authority, libcouchbase_error_t error) { php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; php_ignore_value(handle); php_ignore_value(authority); if (--ctx->res->seqno == 0) { ctx->res->io->stop_event_loop(ctx->res->io); } ctx->exception = error; }
/* {{{ static void php_couchbase_remove_callback(...) */ static void php_couchbase_remove_callback(libcouchbase_t handle, const void *cookie, libcouchbase_error_t error, const void *key, size_t nkey) { php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; php_ignore_value(handle); php_ignore_value(key); php_ignore_value(nkey); if (--ctx->res->seqno == 0) { ctx->res->io->stop_event_loop(ctx->res->io); } ctx->exception = error; }
static int ps_files_write(ps_files *data, zend_string *key, zend_string *val) { zend_long n = 0; /* PS(id) may be changed by calling session_regenerate_id(). Re-initialization should be tried here. ps_files_open() checks data->lastkey and reopen when it is needed. */ ps_files_open(data, ZSTR_VAL(key)); if (data->fd < 0) { return FAILURE; } /* Truncate file if the amount of new data is smaller than the existing data set. */ if (ZSTR_LEN(val) < data->st_size) { php_ignore_value(ftruncate(data->fd, 0)); } #if defined(HAVE_PWRITE) n = pwrite(data->fd, ZSTR_VAL(val), ZSTR_LEN(val), 0); #else lseek(data->fd, 0, SEEK_SET); #ifdef PHP_WIN32 { unsigned int to_write = ZSTR_LEN(val) > UINT_MAX ? UINT_MAX : (unsigned int)ZSTR_LEN(val); char *buf = ZSTR_VAL(val); int wrote; do { wrote = _write(data->fd, buf, to_write); n += wrote; buf = wrote > -1 ? buf + wrote : 0; to_write = wrote > -1 ? (ZSTR_LEN(val) - n > UINT_MAX ? UINT_MAX : (unsigned int)(ZSTR_LEN(val) - n)): 0; } while(wrote > 0); } #else n = write(data->fd, ZSTR_VAL(val), ZSTR_LEN(val)); #endif #endif if (n != ZSTR_LEN(val)) { if (n == -1) { php_error_docref(NULL, E_WARNING, "write failed: %s (%d)", strerror(errno), errno); } else { php_error_docref(NULL, E_WARNING, "write wrote less bytes than requested"); } return FAILURE; } return SUCCESS; }
/* {{{ static void php_couchbase_arithmetic_callback(...) */ static void php_couchbase_arithmetic_callback(libcouchbase_t handle, const void *cookie, libcouchbase_error_t error, const void *key, size_t nkey, uint64_t value, uint64_t cas) { php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; php_ignore_value(handle); php_ignore_value(key); php_ignore_value(nkey); php_ignore_value(cas); if (--ctx->res->seqno == 0) { ctx->res->io->stop_event_loop(ctx->res->io); } ctx->exception = error; if (LIBCOUCHBASE_SUCCESS != error) { return; } ZVAL_LONG(ctx->rv, value); }
/* {{{ static void php_couchbase_get_callback(...) */ static void php_couchbase_get_callback(libcouchbase_t handle, const void *cookie, libcouchbase_error_t error, const void *key, size_t nkey, const void *bytes, size_t nbytes, uint32_t flag, uint64_t cas) { php_couchbase_ctx *ctx = (php_couchbase_ctx *)cookie; php_ignore_value(handle); if (--ctx->res->seqno == 0) { ctx->res->io->stop_event_loop(ctx->res->io); } ctx->exception = error; if (LIBCOUCHBASE_SUCCESS != error && LIBCOUCHBASE_KEY_ENOENT != error) { ctx->res->io->stop_event_loop(ctx->res->io); return; } if (LIBCOUCHBASE_KEY_ENOENT == error) { ZVAL_NULL(ctx->rv); return; } if (IS_ARRAY == Z_TYPE_P(ctx->rv)) { /* multi get */ zval *v; MAKE_STD_ZVAL(v); ZVAL_STRINGL(v, (char *)bytes, nbytes, 1); zend_hash_add(Z_ARRVAL_P(ctx->rv), (char *)key, nkey + 1, (void **)&v, sizeof(zval *), NULL); if (ctx->cas) { zval *c; MAKE_STD_ZVAL(c); ZVAL_DOUBLE(c, cas); zend_hash_add(Z_ARRVAL_P(ctx->cas), (char *)key, nkey + 1, (void **)&c, sizeof(zval *), NULL); } } else { ZVAL_STRINGL(ctx->rv, (char *)bytes, nbytes, 1); if (ctx->cas) { ZVAL_DOUBLE(ctx->cas, 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); }
PHP_COUCHBASE_LOCAL void php_couchbase_callbacks_arithmetic_init(lcb_t handle) { php_ignore_value( lcb_set_arithmetic_callback(handle, php_couchbase_arithmetic_callback)); }