quaint_forked/connector/mysql/
error.rs1use 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}