quaint_forked/connector/mysql/
error.rs

1use crate::error::{DatabaseConstraint, Error, ErrorKind};
2use mysql_async as my;
3
4impl From<my::Error> for Error {
5    fn from(e: my::Error) -> Error {
6        use my::ServerError;
7
8        match e {
9            my::Error::Io(my::IoError::Tls(err)) => Error::builder(ErrorKind::TlsError {
10                message: err.to_string(),
11            })
12            .build(),
13            my::Error::Io(my::IoError::Io(err)) if err.kind() == std::io::ErrorKind::UnexpectedEof => {
14                Error::builder(ErrorKind::ConnectionClosed).build()
15            }
16            my::Error::Io(io_error) => Error::builder(ErrorKind::ConnectionError(io_error.into())).build(),
17            my::Error::Driver(e) => Error::builder(ErrorKind::QueryError(e.into())).build(),
18            my::Error::Server(ServerError { ref message, code, .. }) if code == 1062 => {
19                let constraint = message
20                    .split_whitespace()
21                    .last()
22                    .and_then(|s| s.split('\'').nth(1))
23                    .and_then(|s| s.split('.').last())
24                    .map(ToString::to_string)
25                    .map(DatabaseConstraint::Index)
26                    .unwrap_or(DatabaseConstraint::CannotParse);
27
28                let kind = ErrorKind::UniqueConstraintViolation { constraint };
29                let mut builder = Error::builder(kind);
30
31                builder.set_original_code(format!("{code}"));
32                builder.set_original_message(message);
33
34                builder.build()
35            }
36            my::Error::Server(ServerError { ref message, code, .. }) if code == 1451 || code == 1452 => {
37                let constraint = message
38                    .split_whitespace()
39                    .nth(17)
40                    .and_then(|s| s.split('`').nth(1))
41                    .map(|s| DatabaseConstraint::fields(Some(s)))
42                    .unwrap_or(DatabaseConstraint::CannotParse);
43
44                let kind = ErrorKind::ForeignKeyConstraintViolation { constraint };
45                let mut builder = Error::builder(kind);
46
47                builder.set_original_code(format!("{code}"));
48                builder.set_original_message(message);
49
50                builder.build()
51            }
52            my::Error::Server(ServerError { ref message, code, .. }) if code == 1263 => {
53                let constraint = message
54                    .split_whitespace()
55                    .last()
56                    .and_then(|s| s.split('\'').nth(1))
57                    .map(ToString::to_string)
58                    .map(DatabaseConstraint::Index)
59                    .unwrap_or(DatabaseConstraint::CannotParse);
60
61                let kind = ErrorKind::NullConstraintViolation { constraint };
62                let mut builder = Error::builder(kind);
63
64                builder.set_original_code(format!("{code}"));
65                builder.set_original_message(message);
66
67                builder.build()
68            }
69            my::Error::Server(ServerError { ref message, code, .. }) if code == 1264 => {
70                let mut builder = Error::builder(ErrorKind::ValueOutOfRange {
71                    message: message.clone(),
72                });
73
74                builder.set_original_code(code.to_string());
75                builder.set_original_message(message);
76
77                builder.build()
78            }
79            my::Error::Server(ServerError { ref message, code, .. }) if code == 1364 || code == 1048 => {
80                let constraint = message
81                    .split_whitespace()
82                    .nth(1)
83                    .and_then(|s| s.split('\'').nth(1))
84                    .map(|s| DatabaseConstraint::fields(Some(s)))
85                    .unwrap_or(DatabaseConstraint::CannotParse);
86
87                let kind = ErrorKind::NullConstraintViolation { constraint };
88                let mut builder = Error::builder(kind);
89
90                builder.set_original_code(format!("{code}"));
91                builder.set_original_message(message);
92
93                builder.build()
94            }
95            my::Error::Server(ServerError { ref message, code, .. }) if code == 1049 => {
96                let db_name = message
97                    .split_whitespace()
98                    .last()
99                    .and_then(|s| s.split('\'').nth(1))
100                    .into();
101
102                let kind = ErrorKind::DatabaseDoesNotExist { db_name };
103                let mut builder = Error::builder(kind);
104
105                builder.set_original_code(format!("{code}"));
106                builder.set_original_message(message);
107
108                builder.build()
109            }
110            my::Error::Server(ServerError { ref message, code, .. }) if code == 1007 => {
111                let db_name = message
112                    .split_whitespace()
113                    .nth(3)
114                    .and_then(|s| s.split('\'').nth(1))
115                    .into();
116
117                let kind = ErrorKind::DatabaseAlreadyExists { db_name };
118                let mut builder = Error::builder(kind);
119
120                builder.set_original_code(format!("{code}"));
121                builder.set_original_message(message);
122
123                builder.build()
124            }
125            my::Error::Server(ServerError { ref message, code, .. }) if code == 1044 => {
126                let db_name = message
127                    .split_whitespace()
128                    .last()
129                    .and_then(|s| s.split('\'').nth(1))
130                    .into();
131
132                let kind = ErrorKind::DatabaseAccessDenied { db_name };
133                let mut builder = Error::builder(kind);
134
135                builder.set_original_code(format!("{code}"));
136                builder.set_original_message(message);
137
138                builder.build()
139            }
140            my::Error::Server(ServerError { ref message, code, .. }) if code == 1045 => {
141                let user = message
142                    .split_whitespace()
143                    .nth(4)
144                    .and_then(|s| s.split('@').next())
145                    .and_then(|s| s.split('\'').nth(1))
146                    .into();
147
148                let kind = ErrorKind::AuthenticationFailed { user };
149                let mut builder = Error::builder(kind);
150
151                builder.set_original_code(format!("{code}"));
152                builder.set_original_message(message);
153
154                builder.build()
155            }
156            my::Error::Server(ServerError { ref message, code, .. }) if code == 1146 => {
157                let table = message
158                    .split_whitespace()
159                    .nth(1)
160                    .and_then(|s| s.split('\'').nth(1))
161                    .and_then(|s| s.split('.').last())
162                    .into();
163
164                let kind = ErrorKind::TableDoesNotExist { table };
165                let mut builder = Error::builder(kind);
166
167                builder.set_original_code(format!("{code}"));
168                builder.set_original_message(message);
169
170                builder.build()
171            }
172            my::Error::Server(ServerError { ref message, code, .. }) if code == 1054 => {
173                let column = message
174                    .split_whitespace()
175                    .nth(2)
176                    .and_then(|s| s.split('\'').nth(1))
177                    .into();
178
179                let mut builder = Error::builder(ErrorKind::ColumnNotFound { column });
180
181                builder.set_original_code(format!("{code}"));
182                builder.set_original_message(message);
183
184                builder.build()
185            }
186            my::Error::Server(ServerError {
187                ref message,
188                code,
189                state: _,
190            }) if code == 1406 => {
191                let column = message.split_whitespace().flat_map(|s| s.split('\'')).nth(6).into();
192
193                let kind = ErrorKind::LengthMismatch { column };
194                let mut builder = Error::builder(kind);
195
196                builder.set_original_code(code.to_string());
197                builder.set_original_message(message);
198
199                builder.build()
200            }
201            my::Error::Server(ServerError {
202                ref message,
203                code,
204                state: _,
205            }) if code == 1191 => {
206                let kind = ErrorKind::MissingFullTextSearchIndex;
207                let mut builder = Error::builder(kind);
208
209                builder.set_original_code(code.to_string());
210                builder.set_original_message(message);
211
212                builder.build()
213            }
214            my::Error::Server(ServerError {
215                ref message,
216                code,
217                state: _,
218            }) if code == 1213 => {
219                let mut builder = Error::builder(ErrorKind::TransactionWriteConflict);
220                builder.set_original_code(format!("{code}"));
221                builder.set_original_message(message);
222                builder.build()
223            }
224            my::Error::Server(ServerError {
225                ref message,
226                code,
227                ref state,
228            }) => {
229                let kind = ErrorKind::QueryError(
230                    my::Error::Server(ServerError {
231                        message: message.clone(),
232                        code,
233                        state: state.clone(),
234                    })
235                    .into(),
236                );
237
238                let mut builder = Error::builder(kind);
239                builder.set_original_code(format!("{code}"));
240                builder.set_original_message(message);
241
242                builder.build()
243            }
244            e => Error::builder(ErrorKind::QueryError(e.into())).build(),
245        }
246    }
247}