quaint_forked/connector/mssql/
error.rs1use crate::error::{DatabaseConstraint, Error, ErrorKind};
2use tiberius::error::IoErrorKind;
3
4impl From<tiberius::error::Error> for Error {
5 fn from(e: tiberius::error::Error) -> Error {
6 match e {
7 tiberius::error::Error::Io { kind, message } if kind == IoErrorKind::UnexpectedEof => {
8 let mut builder = Error::builder(ErrorKind::ConnectionClosed);
9 builder.set_original_message(message);
10 builder.build()
11 }
12 e @ tiberius::error::Error::Io { .. } => Error::builder(ErrorKind::ConnectionError(e.into())).build(),
13 tiberius::error::Error::Tls(message) => {
14 let message = format!(
15 "The TLS settings didn't allow the connection to be established. Please review your connection string. (error: {message})"
16 );
17
18 Error::builder(ErrorKind::TlsError { message }).build()
19 }
20 tiberius::error::Error::Server(e) if [3902u32, 3903u32, 3971u32].iter().any(|code| e.code() == *code) => {
21 let kind = ErrorKind::TransactionAlreadyClosed(e.message().to_string());
22
23 let mut builder = Error::builder(kind);
24
25 builder.set_original_code(format!("{}", e.code()));
26 builder.set_original_message(e.message().to_string());
27
28 builder.build()
29 }
30 tiberius::error::Error::Server(e) if e.code() == 8169 => {
31 let kind = ErrorKind::conversion(e.message().to_string());
32
33 let mut builder = Error::builder(kind);
34
35 builder.set_original_code(format!("{}", e.code()));
36 builder.set_original_message(e.message().to_string());
37
38 builder.build()
39 }
40 tiberius::error::Error::Server(e) if e.code() == 18456 => {
41 let user = e.message().split('\'').nth(1).into();
42 let kind = ErrorKind::AuthenticationFailed { user };
43
44 let mut builder = Error::builder(kind);
45
46 builder.set_original_code(format!("{}", e.code()));
47 builder.set_original_message(e.message().to_string());
48
49 builder.build()
50 }
51 tiberius::error::Error::Server(e) if e.code() == 4060 => {
52 let db_name = e.message().split('"').nth(1).into();
53 let kind = ErrorKind::DatabaseDoesNotExist { db_name };
54 let mut builder = Error::builder(kind);
55
56 builder.set_original_code(format!("{}", e.code()));
57 builder.set_original_message(e.message().to_string());
58
59 builder.build()
60 }
61 tiberius::error::Error::Server(e) if e.code() == 515 => {
62 let constraint = e
63 .message()
64 .split_whitespace()
65 .nth(7)
66 .and_then(|s| s.split('\'').nth(1))
67 .map(|s| DatabaseConstraint::fields(Some(s)))
68 .unwrap_or(DatabaseConstraint::CannotParse);
69
70 let kind = ErrorKind::NullConstraintViolation { constraint };
71 let mut builder = Error::builder(kind);
72
73 builder.set_original_code(format!("{}", e.code()));
74 builder.set_original_message(e.message().to_string());
75
76 builder.build()
77 }
78 tiberius::error::Error::Server(e) if e.code() == 1801 => {
79 let db_name = e.message().split('\'').nth(1).into();
80 let kind = ErrorKind::DatabaseAlreadyExists { db_name };
81
82 let mut builder = Error::builder(kind);
83
84 builder.set_original_code(format!("{}", e.code()));
85 builder.set_original_message(e.message().to_string());
86
87 builder.build()
88 }
89 tiberius::error::Error::Server(e) if e.code() == 2627 => {
90 let constraint = e
91 .message()
92 .split(". ")
93 .nth(1)
94 .and_then(|s| s.split(' ').last())
95 .and_then(|s| s.split('\'').nth(1))
96 .map(ToString::to_string)
97 .map(DatabaseConstraint::Index)
98 .unwrap_or(DatabaseConstraint::CannotParse);
99
100 let kind = ErrorKind::UniqueConstraintViolation { constraint };
101 let mut builder = Error::builder(kind);
102
103 builder.set_original_code(format!("{}", e.code()));
104 builder.set_original_message(e.message().to_string());
105
106 builder.build()
107 }
108 tiberius::error::Error::Server(e) if e.code() == 547 => {
109 let constraint = e
110 .message()
111 .split('.')
112 .next()
113 .and_then(|s| s.split_whitespace().last())
114 .and_then(|s| s.split('\"').nth(1))
115 .map(ToString::to_string)
116 .map(DatabaseConstraint::Index)
117 .unwrap_or(DatabaseConstraint::CannotParse);
118
119 let kind = ErrorKind::ForeignKeyConstraintViolation { constraint };
120 let mut builder = Error::builder(kind);
121
122 builder.set_original_code(format!("{}", e.code()));
123 builder.set_original_message(e.message().to_string());
124
125 builder.build()
126 }
127 tiberius::error::Error::Server(e) if e.code() == 1505 => {
128 let constraint = e
129 .message()
130 .split('\'')
131 .nth(3)
132 .map(ToString::to_string)
133 .map(DatabaseConstraint::Index)
134 .unwrap_or(DatabaseConstraint::CannotParse);
135
136 let kind = ErrorKind::UniqueConstraintViolation { constraint };
137 let mut builder = Error::builder(kind);
138
139 builder.set_original_code(format!("{}", e.code()));
140 builder.set_original_message(e.message().to_string());
141
142 builder.build()
143 }
144 tiberius::error::Error::Server(e) if e.code() == 2601 => {
145 let constraint = e
146 .message()
147 .split_whitespace()
148 .nth(11)
149 .and_then(|s| s.split('\'').nth(1))
150 .map(ToString::to_string)
151 .map(DatabaseConstraint::Index)
152 .unwrap_or(DatabaseConstraint::CannotParse);
153
154 let kind = ErrorKind::UniqueConstraintViolation { constraint };
155 let mut builder = Error::builder(kind);
156
157 builder.set_original_code(format!("{}", e.code()));
158 builder.set_original_message(e.message().to_string());
159
160 builder.build()
161 }
162 tiberius::error::Error::Server(e) if e.code() == 1801 => {
163 let db_name = e.message().split('\'').nth(1).into();
164 let kind = ErrorKind::DatabaseAlreadyExists { db_name };
165
166 let mut builder = Error::builder(kind);
167
168 builder.set_original_code(format!("{}", e.code()));
169 builder.set_original_message(e.message().to_string());
170
171 builder.build()
172 }
173 tiberius::error::Error::Server(e) if e.code() == 2628 => {
174 let column = e.message().split('\'').nth(3).into();
175 let kind = ErrorKind::LengthMismatch { column };
176
177 let mut builder = Error::builder(kind);
178
179 builder.set_original_code(format!("{}", e.code()));
180 builder.set_original_message(e.message().to_string());
181
182 builder.build()
183 }
184 tiberius::error::Error::Server(e) if e.code() == 208 => {
185 let table = e
186 .message()
187 .split_whitespace()
188 .nth(3)
189 .and_then(|s| s.split('\'').nth(1))
190 .into();
191
192 let kind = ErrorKind::TableDoesNotExist { table };
193 let mut builder = Error::builder(kind);
194
195 builder.set_original_code(format!("{}", e.code()));
196 builder.set_original_message(e.message().to_string());
197
198 builder.build()
199 }
200 tiberius::error::Error::Server(e) if e.code() == 207 => {
201 let column = e
202 .message()
203 .split_whitespace()
204 .nth(3)
205 .and_then(|s| s.split('\'').nth(1))
206 .into();
207
208 let kind = ErrorKind::ColumnNotFound { column };
209 let mut builder = Error::builder(kind);
210
211 builder.set_original_code(format!("{}", e.code()));
212 builder.set_original_message(e.message().to_string());
213
214 builder.build()
215 }
216 tiberius::error::Error::Server(e) if e.code() == 1205 => {
217 let mut builder = Error::builder(ErrorKind::TransactionWriteConflict);
218
219 builder.set_original_code(format!("{}", e.code()));
220 builder.set_original_message(e.message().to_string());
221
222 builder.build()
223 }
224 tiberius::error::Error::Server(e) if e.code() == 3903 => {
225 let mut builder = Error::builder(ErrorKind::RollbackWithoutBegin);
226
227 builder.set_original_code(format!("{}", e.code()));
228 builder.set_original_message(e.message().to_string());
229
230 builder.build()
231 }
232 tiberius::error::Error::Server(e) => {
233 let kind = ErrorKind::QueryError(e.clone().into());
234
235 let mut builder = Error::builder(kind);
236 builder.set_original_code(format!("{}", e.code()));
237 builder.set_original_message(e.message().to_string());
238
239 builder.build()
240 }
241 e => Error::builder(ErrorKind::QueryError(e.into())).build(),
242 }
243 }
244}