fn hook_memcached_server_key_methods()

in src/plugin/plugin_memcached.rs [255:304]


    fn hook_memcached_server_key_methods(
        &self, class_name: &str, function_name: &str,
    ) -> (Box<BeforeExecuteHook>, Box<AfterExecuteHook>) {
        let class_name = class_name.to_owned();
        let function_name = function_name.to_owned();
        (
            Box::new(move |request_id, execute_data| {
                let server_key = {
                    let server_key = execute_data.get_parameter(0);
                    if server_key.get_type_info().is_string() {
                        Some(server_key.clone())
                    } else {
                        // The `*Multi` methods will failed here.
                        warn!(function_name, "The argument server_key isn't string");
                        None
                    }
                };

                let key = execute_data
                    .get_parameter(1)
                    .as_z_str()
                    .and_then(|key| key.to_str().ok())
                    .map(ToOwned::to_owned);

                let this = get_this_mut(execute_data)?;

                let peer = server_key
                    .map(|server_key| get_peer(this, server_key))
                    .unwrap_or_default();

                debug!(peer, "Get memcached peer");

                let tag_info = MEMCACHE_SERVER_KEY_METHOD_MAPPING
                    .get(&*function_name.to_ascii_lowercase())
                    .unwrap();

                let span = create_exit_span(
                    request_id,
                    &class_name,
                    &function_name,
                    &peer,
                    tag_info,
                    key.as_deref(),
                )?;

                Ok(Box::new(span))
            }),
            Box::new(after_hook),
        )
    }