1#![doc = include_str!("../README.md")]
2#![warn(missing_docs)]
3#![deny(unsafe_code)]
4
5pub mod blob;
21pub mod blob_stream;
22pub(crate) mod browser;
23pub mod bulk;
24pub mod cancel;
25pub mod change_tracking;
26pub mod client;
27#[cfg(feature = "always-encrypted")]
28pub(crate) mod column_decryptor;
29pub(crate) mod column_parser;
30pub mod config;
31pub mod encryption;
32pub mod error;
33#[cfg(all(windows, feature = "filestream"))]
34#[allow(unsafe_code)] pub mod filestream;
36pub mod from_row;
37pub mod instrumentation;
38pub(crate) mod plp;
39pub mod procedure;
40pub mod query;
41pub mod row;
42pub(crate) mod row_source;
44pub mod row_stream;
45pub mod state;
46pub(crate) mod statement_cache;
50pub mod stream;
51pub mod to_params;
52pub mod transaction;
53pub mod tvp;
54pub(crate) mod validation;
55
56pub use bulk::{
58 BulkColumn, BulkInsert, BulkInsertBuilder, BulkInsertResult, BulkOptions, BulkWriter,
59};
60pub use cancel::CancelHandle;
61pub use client::Client;
62pub use config::{ApplicationIntent, Config, RedirectConfig, RetryPolicy, TimeoutConfig};
63pub use error::{Error, SharedIoError};
64pub use mssql_auth::AuthError;
71pub use mssql_codec::CodecError;
72#[cfg(feature = "tls")]
73pub use mssql_tls::TlsError;
74pub use mssql_types::TypeError;
75pub use tds_protocol::ProtocolError;
76
77#[cfg(feature = "tls")]
81pub use mssql_tls::{CertificateDer, TlsConfig};
82
83#[cfg(feature = "always-encrypted")]
87pub use mssql_auth::KeyStoreProvider;
88
89pub use tds_protocol::token::Collation;
93
94#[cfg(feature = "derive")]
101pub use mssql_derive::{FromRow, ToParams, Tvp};
102
103#[doc(hidden)]
107pub mod __private {
108 pub use mssql_types::{ToSql, TypeError};
109}
110
111pub use from_row::{FromRow, MapRows, RowIteratorExt};
113pub use mssql_auth::Credentials;
114pub use tds_protocol::version::TdsVersion;
115
116#[cfg(feature = "zeroize")]
118pub use mssql_auth::{SecretString, SecureCredentials};
119pub use mssql_types::{
120 Binary, Char, EncryptedParamType, FromSql, NChar, SqlTyped, SqlValue, ToSql, TypedNull, binary,
121 char, nchar, null,
122};
123#[cfg(feature = "chrono")]
124pub use mssql_types::{
125 DateTime2, DateTimeLegacy, DateTimeOffset, SmallDateTime, Time, datetime, datetime2,
126 datetimeoffset, time,
127};
128#[cfg(feature = "decimal")]
129pub use mssql_types::{Money, Numeric, SmallMoney, numeric};
130pub use procedure::ProcedureBuilder;
131pub use query::in_params;
132pub use row::{Column, Row};
133pub use state::{Connected, ConnectionState, Disconnected, InTransaction, ProtocolState, Ready};
134
135#[cfg(feature = "fuzzing")]
140#[doc(hidden)]
141pub mod __fuzzing {
142 pub use crate::column_parser::parse_column_value;
143}
144
145#[cfg(feature = "bench")]
150#[doc(hidden)]
151#[allow(clippy::expect_used)]
152pub mod __bench {
153 use bytes::Bytes;
154 use tds_protocol::token::{Token, TokenParser};
155
156 use crate::Ready;
157 use crate::client::Client;
158 use crate::row::Row;
159
160 #[must_use]
169 pub fn decode_buffered_response(bytes: Bytes) -> Vec<Row> {
170 let mut parser = TokenParser::new(bytes);
171 let mut row_meta = std::sync::Arc::new(crate::row::ColMetaData::new(Vec::new()));
172 let mut meta = None;
173 let mut rows = Vec::new();
174 while let Some(token) = parser
175 .next_token_with_metadata(meta.as_ref())
176 .expect("benchmark fixture must decode")
177 {
178 match token {
179 Token::ColMetaData(m) => {
180 row_meta = std::sync::Arc::new(crate::row::ColMetaData::new(
181 Client::<Ready>::build_columns(&m),
182 ));
183 meta = Some(m);
184 }
185 Token::Row(raw) => {
186 let m = meta.as_ref().expect("ColMetaData precedes ROW tokens");
187 rows.push(
188 crate::column_parser::convert_raw_row(&raw, m, &row_meta)
189 .expect("benchmark row must convert"),
190 );
191 }
192 _ => {}
193 }
194 }
195 rows
196 }
197}
198pub use blob_stream::BlobStream;
199pub use row_stream::RowStream;
200pub use stream::{
201 ExecuteResult, MultiResultStream, OutputParam, ProcedureResult, QueryStream, ResultSet,
202};
203pub use to_params::{NamedParam, ParamList, ToParams};
204pub use transaction::{IsolationLevel, SavePoint, Transaction};
205pub use tvp::{Tvp, TvpColumn, TvpRow, TvpValue};
206
207#[cfg(all(windows, feature = "filestream"))]
209pub use filestream::{FileStream, FileStreamAccess, open_options as filestream_options};
210
211pub use encryption::EncryptionConfig;
213
214pub use instrumentation::{
216 DatabaseMetrics, OperationTimer, SanitizationConfig, attributes, metric_names, span_names,
217};
218
219pub use change_tracking::{
221 ChangeMetadata, ChangeOperation, ChangeTracking, ChangeTrackingQuery, SyncVersionStatus,
222};
223
224#[cfg(test)]
225mod auto_trait_tests {
226 use super::*;
233
234 fn assert_send<T: Send>() {}
235 fn assert_sync<T: Sync>() {}
236
237 #[test]
239 fn client_ready_is_send_sync() {
240 assert_send::<Client<Ready>>();
241 assert_sync::<Client<Ready>>();
242 }
243
244 #[test]
245 fn client_in_transaction_is_send_sync() {
246 assert_send::<Client<InTransaction>>();
247 assert_sync::<Client<InTransaction>>();
248 }
249
250 #[test]
251 fn client_disconnected_is_send_sync() {
252 assert_send::<Client<Disconnected>>();
253 assert_sync::<Client<Disconnected>>();
254 }
255
256 #[test]
257 fn client_connected_is_send_sync() {
258 assert_send::<Client<Connected>>();
259 assert_sync::<Client<Connected>>();
260 }
261
262 #[test]
264 fn config_is_send_sync() {
265 assert_send::<Config>();
266 assert_sync::<Config>();
267 }
268
269 #[test]
271 fn query_stream_is_send_sync() {
272 assert_send::<QueryStream<'_>>();
273 assert_sync::<QueryStream<'_>>();
274 }
275
276 #[test]
277 fn row_stream_is_send_sync() {
278 assert_send::<RowStream<'_>>();
279 assert_sync::<RowStream<'_>>();
280 }
281
282 #[test]
283 fn blob_stream_is_send_sync() {
284 assert_send::<BlobStream<'_>>();
285 assert_sync::<BlobStream<'_>>();
286 }
287
288 #[test]
289 fn multi_result_stream_is_send_sync() {
290 assert_send::<MultiResultStream<'_>>();
291 assert_sync::<MultiResultStream<'_>>();
292 }
293
294 #[test]
295 fn result_set_is_send_sync() {
296 assert_send::<ResultSet>();
297 assert_sync::<ResultSet>();
298 }
299
300 #[test]
301 fn execute_result_is_send_sync() {
302 assert_send::<ExecuteResult>();
303 assert_sync::<ExecuteResult>();
304 }
305
306 #[test]
307 fn procedure_result_is_send_sync() {
308 assert_send::<ProcedureResult>();
309 assert_sync::<ProcedureResult>();
310 }
311
312 #[test]
313 fn procedure_builder_is_send_sync() {
314 assert_send::<ProcedureBuilder<'_, Ready>>();
315 assert_sync::<ProcedureBuilder<'_, Ready>>();
316 }
317
318 #[test]
320 fn bulk_insert_is_send_sync() {
321 assert_send::<BulkInsert>();
322 assert_sync::<BulkInsert>();
323 }
324
325 #[test]
326 fn bulk_insert_builder_is_send_sync() {
327 assert_send::<BulkInsertBuilder>();
328 assert_sync::<BulkInsertBuilder>();
329 }
330
331 #[test]
332 fn bulk_options_is_send_sync() {
333 assert_send::<BulkOptions>();
334 assert_sync::<BulkOptions>();
335 }
336
337 #[test]
339 fn cancel_handle_is_send_sync() {
340 assert_send::<CancelHandle>();
341 assert_sync::<CancelHandle>();
342 }
343
344 #[test]
346 fn row_is_send_sync() {
347 assert_send::<Row>();
348 assert_sync::<Row>();
349 }
350
351 #[test]
352 fn column_is_send_sync() {
353 assert_send::<Column>();
354 assert_sync::<Column>();
355 }
356
357 #[test]
359 fn statement_cache_is_send_sync() {
360 use crate::statement_cache::StatementCache;
361 assert_send::<StatementCache>();
362 assert_sync::<StatementCache>();
363 }
364
365 #[test]
367 fn error_is_send_sync() {
368 assert_send::<Error>();
369 assert_sync::<Error>();
370 }
371}