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}