1
use crate::core::protocol::{
2
    CreateDatabaseError, CreateUserError, DropDatabaseError, DropUserError,
3
    GetDatabasesPrivilegeDataError, ListUsersError, request_validation::DbOrUser,
4
};
5

            
6
pub fn name_validation_error_to_error_message(name: &str, db_or_user: DbOrUser) -> String {
7
    let argv0 = std::env::args().next().unwrap_or_else(|| match db_or_user {
8
        DbOrUser::Database => "mysql-dbadm".to_string(),
9
        DbOrUser::User => "mysql-useradm".to_string(),
10
    });
11

            
12
    format!(
13
        concat!(
14
            "{}: {} name '{}' contains invalid characters.\n",
15
            "Only A-Z, a-z, 0-9, _ (underscore) and - (dash) permitted. Skipping.",
16
        ),
17
        argv0,
18
        db_or_user.capitalized(),
19
        name,
20
    )
21
}
22

            
23
pub fn owner_validation_error_message(name: &str, db_or_user: DbOrUser) -> String {
24
    format!(
25
        "You are not in charge of mysql-{}: '{}'.  Skipping.",
26
        db_or_user.lowercased(),
27
        name
28
    )
29
}
30

            
31
pub fn handle_create_user_error(error: CreateUserError, name: &str) {
32
    let argv0 = std::env::args()
33
        .next()
34
        .unwrap_or_else(|| "mysql-useradm".to_string());
35
    match error {
36
        CreateUserError::SanitizationError(_) => {
37
            eprintln!(
38
                "{}",
39
                name_validation_error_to_error_message(name, DbOrUser::User)
40
            );
41
        }
42
        CreateUserError::OwnershipError(_) => {
43
            eprintln!("{}", owner_validation_error_message(name, DbOrUser::User));
44
        }
45
        CreateUserError::MySqlError(_) | CreateUserError::UserAlreadyExists => {
46
            eprintln!("{}: Failed to create user '{}'.", argv0, name);
47
        }
48
    }
49
}
50

            
51
pub fn handle_drop_user_error(error: DropUserError, name: &str) {
52
    let argv0 = std::env::args()
53
        .next()
54
        .unwrap_or_else(|| "mysql-useradm".to_string());
55
    match error {
56
        DropUserError::SanitizationError(_) => {
57
            eprintln!(
58
                "{}",
59
                name_validation_error_to_error_message(name, DbOrUser::User)
60
            );
61
        }
62
        DropUserError::OwnershipError(_) => {
63
            eprintln!("{}", owner_validation_error_message(name, DbOrUser::User));
64
        }
65
        DropUserError::MySqlError(_) | DropUserError::UserDoesNotExist => {
66
            eprintln!("{}: Failed to delete user '{}'.", argv0, name);
67
        }
68
    }
69
}
70

            
71
pub fn handle_list_users_error(error: ListUsersError, name: &str) {
72
    let argv0 = std::env::args()
73
        .next()
74
        .unwrap_or_else(|| "mysql-useradm".to_string());
75
    match error {
76
        ListUsersError::SanitizationError(_) => {
77
            eprintln!(
78
                "{}",
79
                name_validation_error_to_error_message(name, DbOrUser::User)
80
            );
81
        }
82
        ListUsersError::OwnershipError(_) => {
83
            eprintln!("{}", owner_validation_error_message(name, DbOrUser::User));
84
        }
85
        ListUsersError::UserDoesNotExist => {
86
            eprintln!(
87
                "{}: User '{}' does not exist. You must create it first.",
88
                argv0, name,
89
            );
90
        }
91
        ListUsersError::MySqlError(_) => {
92
            eprintln!("{}: Failed to look up password for user '{}'", argv0, name);
93
        }
94
    }
95
}
96

            
97
// ----------------------------------------------------------------------------
98

            
99
pub fn handle_create_database_error(error: CreateDatabaseError, name: &str) {
100
    let argv0 = std::env::args()
101
        .next()
102
        .unwrap_or_else(|| "mysql-dbadm".to_string());
103
    match error {
104
        CreateDatabaseError::SanitizationError(_) => {
105
            eprintln!(
106
                "{}",
107
                name_validation_error_to_error_message(name, DbOrUser::Database)
108
            );
109
        }
110
        CreateDatabaseError::OwnershipError(_) => {
111
            eprintln!(
112
                "{}",
113
                owner_validation_error_message(name, DbOrUser::Database)
114
            );
115
        }
116
        CreateDatabaseError::MySqlError(_) => {
117
            eprintln!("{}: Cannot create database '{}'.", argv0, name);
118
        }
119
        CreateDatabaseError::DatabaseAlreadyExists => {
120
            eprintln!("{}: Database '{}' already exists.", argv0, name);
121
        }
122
    }
123
}
124

            
125
pub fn handle_drop_database_error(error: DropDatabaseError, name: &str) {
126
    let argv0 = std::env::args()
127
        .next()
128
        .unwrap_or_else(|| "mysql-dbadm".to_string());
129
    match error {
130
        DropDatabaseError::SanitizationError(_) => {
131
            eprintln!(
132
                "{}",
133
                name_validation_error_to_error_message(name, DbOrUser::Database)
134
            );
135
        }
136
        DropDatabaseError::OwnershipError(_) => {
137
            eprintln!(
138
                "{}",
139
                owner_validation_error_message(name, DbOrUser::Database)
140
            );
141
        }
142
        DropDatabaseError::MySqlError(_) => {
143
            eprintln!("{}: Cannot drop database '{}'.", argv0, name);
144
        }
145
        DropDatabaseError::DatabaseDoesNotExist => {
146
            eprintln!("{}: Database '{}' doesn't exist.", argv0, name);
147
        }
148
    }
149
}
150

            
151
pub fn format_show_database_error_message(
152
    error: GetDatabasesPrivilegeDataError,
153
    name: &str,
154
) -> String {
155
    let argv0 = std::env::args()
156
        .next()
157
        .unwrap_or_else(|| "mysql-dbadm".to_string());
158

            
159
    match error {
160
        GetDatabasesPrivilegeDataError::SanitizationError(_) => {
161
            name_validation_error_to_error_message(name, DbOrUser::Database)
162
        }
163
        GetDatabasesPrivilegeDataError::OwnershipError(_) => {
164
            owner_validation_error_message(name, DbOrUser::Database)
165
        }
166
        GetDatabasesPrivilegeDataError::MySqlError(err) => {
167
            format!(
168
                "{}: Failed to look up privileges for database '{}': {}",
169
                argv0, name, err
170
            )
171
        }
172
        GetDatabasesPrivilegeDataError::DatabaseDoesNotExist => {
173
            format!("{}: Database '{}' doesn't exist.", argv0, name)
174
        }
175
    }
176
}