zend_bool php_memc_mget_apply()

in php_memcached.c [704:757]


zend_bool php_memc_mget_apply(php_memc_object_t *intern, zend_string *server_key, php_memc_keys_t *keys,
						php_memc_result_apply_fn result_apply_fn, zend_bool with_cas, void *context)
{
	memcached_return status;
	int mget_status;
	uint64_t orig_cas_flag = 0;

	// Reset status code
	s_memc_set_status(intern, MEMCACHED_SUCCESS, 0);

	if (!keys->num_valid_keys) {
		intern->rescode = MEMCACHED_BAD_KEY_PROVIDED;
		return 0;
	}

	if (with_cas) {
		orig_cas_flag = memcached_behavior_get (intern->memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS);

		if (!orig_cas_flag) {
			memcached_behavior_set (intern->memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
		}
	}

	if (server_key) {
		status = memcached_mget_by_key(intern->memc, ZSTR_VAL(server_key), ZSTR_LEN(server_key), keys->mkeys, keys->mkeys_len, keys->num_valid_keys);
	} else {
		status = memcached_mget(intern->memc, keys->mkeys, keys->mkeys_len, keys->num_valid_keys);
	}

	/* Need to handle result code before restoring cas flags, would mess up errno */
	mget_status = s_memc_status_handle_result_code(intern, status);
		
	if (with_cas && !orig_cas_flag) {
		memcached_behavior_set (intern->memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, orig_cas_flag);
	}

	/* Return on failure codes */
	if (mget_status == FAILURE) {
		return 0;
	}

	if (!result_apply_fn) {
		/* no callback, for example getDelayed */
		return 1;
	}

	status = php_memc_result_apply(intern, result_apply_fn, 0, context);

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

	return 1;
}