void php_memc_get_impl()

in php_memcached.c [1437:1496]


void php_memc_get_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
{
	php_memc_get_ctx_t context = {0};
	php_memc_keys_t keys = {0};
	zend_long get_flags = 0;
	zend_string *key;
	zend_string *server_key = NULL;
	zend_bool mget_status;
	memcached_return status = MEMCACHED_SUCCESS;
	zend_fcall_info fci = empty_fcall_info;
	zend_fcall_info_cache fcc = empty_fcall_info_cache;
	MEMC_METHOD_INIT_VARS;

	if (by_key) {
		/* "SS|f!l" */
		ZEND_PARSE_PARAMETERS_START(2, 4)
		        Z_PARAM_STR(server_key)
		        Z_PARAM_STR(key)
		        Z_PARAM_OPTIONAL
		        Z_PARAM_FUNC_EX(fci, fcc, 1, 0)
		        Z_PARAM_LONG(get_flags)
		ZEND_PARSE_PARAMETERS_END();
	} else {
		/* "S|f!l" */
		ZEND_PARSE_PARAMETERS_START(1, 3)
		        Z_PARAM_STR(key)
		        Z_PARAM_OPTIONAL
		        Z_PARAM_FUNC_EX(fci, fcc, 1, 0)
		        Z_PARAM_LONG(get_flags)
		ZEND_PARSE_PARAMETERS_END();
	}

	MEMC_METHOD_FETCH_OBJECT;
	s_memc_set_status(intern, MEMCACHED_SUCCESS, 0);
	MEMC_CHECK_KEY(intern, key);

	context.extended = (get_flags & MEMC_GET_EXTENDED);

	context.return_value = return_value;

	s_key_to_keys(&keys, key);
	mget_status = php_memc_mget_apply(intern, server_key, &keys, s_get_apply_fn, context.extended, &context);
	s_clear_keys(&keys);

	if (!mget_status) {
		if (s_memc_status_has_result_code(intern, MEMCACHED_NOTFOUND) && fci.size > 0) {
			status = s_invoke_cache_callback(object, &fci, &fcc, context.extended, key, return_value);

			if (!status) {
				zval_ptr_dtor(return_value);
				RETURN_FROM_GET;
			}
		}
	}

	if (s_memc_status_has_error(intern)) {
		zval_ptr_dtor(return_value);
		RETURN_FROM_GET;
	}
}