mysql_async/conn/routines/
change_user.rs

1use futures_core::future::BoxFuture;
2use futures_util::FutureExt;
3use mysql_common::{
4    constants::{UTF8MB4_GENERAL_CI, UTF8_GENERAL_CI},
5    packets::{ComChangeUser, ComChangeUserMoreData},
6};
7#[cfg(feature = "tracing")]
8use tracing::debug_span;
9
10use crate::Conn;
11
12use super::Routine;
13
14/// A routine that performs `COM_CHANGE_USER`.
15#[derive(Debug, Copy, Clone)]
16pub struct ChangeUser;
17
18impl Routine<()> for ChangeUser {
19    fn call<'a>(&'a mut self, conn: &'a mut Conn) -> BoxFuture<'a, crate::Result<()>> {
20        #[cfg(feature = "tracing")]
21        let span = debug_span!(
22            "mysql_async::change_user",
23            mysql_async.connection.id = conn.id()
24        );
25
26        let com_change_user = ComChangeUser::new()
27            .with_user(conn.opts().user().map(|x| x.as_bytes()))
28            .with_database(conn.opts().db_name().map(|x| x.as_bytes()))
29            .with_auth_plugin_data(
30                conn.inner
31                    .auth_plugin
32                    .gen_data(conn.opts().pass(), &conn.inner.nonce)
33                    .as_deref(),
34            )
35            .with_more_data(Some(
36                ComChangeUserMoreData::new(if conn.inner.version >= (5, 5, 3) {
37                    UTF8MB4_GENERAL_CI
38                } else {
39                    UTF8_GENERAL_CI
40                })
41                .with_auth_plugin(Some(conn.inner.auth_plugin.clone()))
42                .with_connect_attributes(None),
43            ))
44            .into_owned();
45
46        let fut = async move {
47            conn.write_command(&com_change_user).await?;
48            conn.inner.auth_switched = false;
49            conn.continue_auth().await?;
50            Ok(())
51        };
52
53        #[cfg(feature = "tracing")]
54        let fut = instrument_result!(fut, span);
55
56        fut.boxed()
57    }
58}