zend_bool s_memc_write_zval()

in php_memcached.c [1107:1204]


zend_bool s_memc_write_zval (php_memc_object_t *intern, php_memc_write_op op, zend_string *server_key, zend_string *key, zval *value, time_t expiration)
{
	uint32_t flags = 0;
	zend_string *payload = NULL;
	memcached_return status = 0;
	php_memc_user_data_t *memc_user_data = memcached_get_user_data(intern->memc);
	zend_long retries = memc_user_data->store_retry_count;

	if (value) {
		payload = s_zval_to_payload(intern, value, &flags);

		if (!payload) {
			s_memc_set_status(intern, MEMC_RES_PAYLOAD_FAILURE, 0);
			return 0;
		}
	}

#define memc_write_using_fn(fn_name) payload ? fn_name(intern->memc, ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(payload), ZSTR_LEN(payload), expiration, flags) : MEMC_RES_PAYLOAD_FAILURE;
#define memc_write_using_fn_by_key(fn_name) payload ? fn_name(intern->memc, ZSTR_VAL(server_key), ZSTR_LEN(server_key), ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(payload), ZSTR_LEN(payload), expiration, flags) : MEMC_RES_PAYLOAD_FAILURE;

	if (server_key) {
		switch (op) {
			case MEMC_OP_SET:
				status = memc_write_using_fn_by_key(memcached_set_by_key);
			break;

			case MEMC_OP_TOUCH:
				status = php_memcached_touch_by_key(intern->memc, ZSTR_VAL(server_key), ZSTR_LEN(server_key), ZSTR_VAL(key), ZSTR_LEN(key), expiration);
			break;
			
			case MEMC_OP_ADD:
				status = memc_write_using_fn_by_key(memcached_add_by_key);
			break;
			
			case MEMC_OP_REPLACE:
				status = memc_write_using_fn_by_key(memcached_replace_by_key);
			break;
			
			case MEMC_OP_APPEND:
				status = memc_write_using_fn_by_key(memcached_append_by_key);
			break;

			case MEMC_OP_PREPEND:
				status = memc_write_using_fn_by_key(memcached_prepend_by_key);
			break;
		}

		if (status == MEMCACHED_END) {
			status = MEMCACHED_SUCCESS;
		}
	}
	else {
retry:
		switch (op) {
			case MEMC_OP_SET:
				status = memc_write_using_fn(memcached_set);
			break;

			case MEMC_OP_TOUCH:
				status = php_memcached_touch(intern->memc, ZSTR_VAL(key), ZSTR_LEN(key), expiration);
			break;
			
			case MEMC_OP_ADD:
				status = memc_write_using_fn(memcached_add);
			break;
			
			case MEMC_OP_REPLACE:
				status = memc_write_using_fn(memcached_replace);
			break;
			
			case MEMC_OP_APPEND:
				status = memc_write_using_fn(memcached_append);
			break;

			case MEMC_OP_PREPEND:
				status = memc_write_using_fn(memcached_prepend);
			break;
		}
		if (status == MEMCACHED_END) {
			status = MEMCACHED_SUCCESS;
		}
	}

	if (s_should_retry_write (intern, status) && retries-- > 0) {
		goto retry;
	}

#undef memc_write_using_fn
#undef memc_write_using_fn_by_key

	if (payload) {
		zend_string_release(payload);
	}
	if (s_memc_status_handle_result_code(intern, status) == FAILURE) {
		return 0;
	}
	return 1;
}