sqlint/connector/mssql/
error.rs

1use 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.message().split_whitespace().nth(3).and_then(|s| s.split('\'').nth(1)).into();
186
187                let kind = ErrorKind::TableDoesNotExist { table };
188                let mut builder = Error::builder(kind);
189
190                builder.set_original_code(format!("{}", e.code()));
191                builder.set_original_message(e.message().to_string());
192
193                builder.build()
194            }
195            tiberius::error::Error::Server(e) if e.code() == 207 => {
196                let column = e.message().split_whitespace().nth(3).and_then(|s| s.split('\'').nth(1)).into();
197
198                let kind = ErrorKind::ColumnNotFound { column };
199                let mut builder = Error::builder(kind);
200
201                builder.set_original_code(format!("{}", e.code()));
202                builder.set_original_message(e.message().to_string());
203
204                builder.build()
205            }
206            tiberius::error::Error::Server(e) if e.code() == 1205 => {
207                let mut builder = Error::builder(ErrorKind::TransactionWriteConflict);
208
209                builder.set_original_code(format!("{}", e.code()));
210                builder.set_original_message(e.message().to_string());
211
212                builder.build()
213            }
214            tiberius::error::Error::Server(e) if e.code() == 3903 => {
215                let mut builder = Error::builder(ErrorKind::RollbackWithoutBegin);
216
217                builder.set_original_code(format!("{}", e.code()));
218                builder.set_original_message(e.message().to_string());
219
220                builder.build()
221            }
222            tiberius::error::Error::Server(e) => {
223                let kind = ErrorKind::QueryError(e.clone().into());
224
225                let mut builder = Error::builder(kind);
226                builder.set_original_code(format!("{}", e.code()));
227                builder.set_original_message(e.message().to_string());
228
229                builder.build()
230            }
231            e => Error::builder(ErrorKind::QueryError(e.into())).build(),
232        }
233    }
234}