static void php_memc_getMulti_impl()

in php_memcached.c [1540:1597]


static void php_memc_getMulti_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
{
	php_memc_get_ctx_t context;
	php_memc_keys_t keys_out;

	zval *keys = NULL;
	zend_string *server_key = NULL;
	zend_long flags = 0;
	MEMC_METHOD_INIT_VARS;
	zend_bool retval, preserve_order;

	if (by_key) {
		/* "Sa|l" */
		ZEND_PARSE_PARAMETERS_START(2, 3)
		        Z_PARAM_STR(server_key)
		        Z_PARAM_ARRAY(keys)
		        Z_PARAM_OPTIONAL
		        Z_PARAM_LONG(flags)
		ZEND_PARSE_PARAMETERS_END();
	} else {
		/* "a|l" */
		ZEND_PARSE_PARAMETERS_START(1, 2)
		        Z_PARAM_ARRAY(keys)
		        Z_PARAM_OPTIONAL
		        Z_PARAM_LONG(flags)
		ZEND_PARSE_PARAMETERS_END();
	}

	MEMC_METHOD_FETCH_OBJECT;

	array_init(return_value);
	if (zend_hash_num_elements(Z_ARRVAL_P(keys)) == 0) {
		/* BC compatible */
		s_memc_set_status(intern, MEMCACHED_NOTFOUND, 0);
		return;
	}

	s_memc_set_status(intern, MEMCACHED_SUCCESS, 0);

	preserve_order = (flags & MEMC_GET_PRESERVE_ORDER);
	s_hash_to_keys(&keys_out, Z_ARRVAL_P(keys), preserve_order, return_value);

	context.extended = (flags & MEMC_GET_EXTENDED);
	context.return_value = return_value;

	retval = php_memc_mget_apply(intern, server_key, &keys_out, s_get_multi_apply_fn, context.extended, &context);

	s_clear_keys(&keys_out);

	if (!retval && (s_memc_status_has_result_code(intern, MEMCACHED_NOTFOUND) || s_memc_status_has_result_code(intern, MEMCACHED_SOME_ERRORS))) {
		return;
	}

	if (!retval || EG(exception)) {
		zval_dtor(return_value);
		RETURN_FROM_GET;
	}
}