1#![warn(missing_docs)]
71#![deny(unsafe_code)]
72
73pub mod blob;
89pub(crate) mod browser;
90pub mod bulk;
91pub mod cancel;
92pub mod change_tracking;
93pub mod client;
94#[cfg(feature = "always-encrypted")]
95pub(crate) mod column_decryptor;
96pub(crate) mod column_parser;
97pub mod config;
98pub mod encryption;
99pub mod error;
100#[cfg(all(windows, feature = "filestream"))]
101#[allow(unsafe_code)] pub mod filestream;
103pub mod from_row;
104pub mod instrumentation;
105pub mod procedure;
106pub mod query;
107pub mod row;
108pub mod state;
109pub mod statement_cache;
110pub mod stream;
111pub mod to_params;
112pub mod transaction;
113pub mod tvp;
114pub(crate) mod validation;
115
116pub use bulk::{BulkColumn, BulkInsert, BulkInsertBuilder, BulkInsertResult, BulkOptions};
118pub use cancel::CancelHandle;
119pub use client::Client;
120pub use config::{ApplicationIntent, Config, RedirectConfig, RetryPolicy, TimeoutConfig};
121pub use error::{Error, SharedIoError};
122
123pub use from_row::{FromRow, MapRows, RowIteratorExt};
125pub use mssql_auth::Credentials;
126pub use tds_protocol::version::TdsVersion;
127
128#[cfg(feature = "zeroize")]
130pub use mssql_auth::{SecretString, SecureCredentials};
131pub use mssql_types::{FromSql, SqlValue, ToSql};
132pub use procedure::ProcedureBuilder;
133pub use query::Query;
134pub use row::{Column, Row};
135pub use state::{
136 Connected, ConnectionState, Disconnected, InTransaction, ProtocolState, Ready, Streaming,
137};
138pub use statement_cache::{PreparedStatement, StatementCache, StatementCacheConfig};
139pub use stream::{
140 ExecuteResult, MultiResultStream, OutputParam, ProcedureResult, QueryStream, ResultSet,
141};
142pub use to_params::{NamedParam, ParamList, ToParams};
143pub use transaction::{IsolationLevel, SavePoint, Transaction};
144pub use tvp::{Tvp, TvpColumn, TvpRow, TvpValue};
145
146#[cfg(all(windows, feature = "filestream"))]
148pub use filestream::{FileStream, FileStreamAccess, open_options as filestream_options};
149
150#[cfg(feature = "always-encrypted")]
152pub use encryption::EncryptionContext;
153pub use encryption::{
154 EncryptionConfig, ParameterCryptoInfo, ParameterEncryptionInfo, ResultSetEncryptionInfo,
155};
156
157pub use instrumentation::{
159 DatabaseMetrics, OperationTimer, SanitizationConfig, attributes, metric_names, span_names,
160};
161
162pub use change_tracking::{
164 ChangeMetadata, ChangeOperation, ChangeTracking, ChangeTrackingQuery, SyncVersionStatus,
165};
166
167#[cfg(test)]
168mod auto_trait_tests {
169 use super::*;
176
177 fn assert_send<T: Send>() {}
178 fn assert_sync<T: Sync>() {}
179
180 #[test]
182 fn client_ready_is_send_sync() {
183 assert_send::<Client<Ready>>();
184 assert_sync::<Client<Ready>>();
185 }
186
187 #[test]
188 fn client_in_transaction_is_send_sync() {
189 assert_send::<Client<InTransaction>>();
190 assert_sync::<Client<InTransaction>>();
191 }
192
193 #[test]
194 fn client_disconnected_is_send_sync() {
195 assert_send::<Client<Disconnected>>();
196 assert_sync::<Client<Disconnected>>();
197 }
198
199 #[test]
200 fn client_connected_is_send_sync() {
201 assert_send::<Client<Connected>>();
202 assert_sync::<Client<Connected>>();
203 }
204
205 #[test]
206 fn client_streaming_is_send_sync() {
207 assert_send::<Client<Streaming>>();
208 assert_sync::<Client<Streaming>>();
209 }
210
211 #[test]
213 fn config_is_send_sync() {
214 assert_send::<Config>();
215 assert_sync::<Config>();
216 }
217
218 #[test]
220 fn query_stream_is_send_sync() {
221 assert_send::<QueryStream<'_>>();
222 assert_sync::<QueryStream<'_>>();
223 }
224
225 #[test]
226 fn multi_result_stream_is_send_sync() {
227 assert_send::<MultiResultStream<'_>>();
228 assert_sync::<MultiResultStream<'_>>();
229 }
230
231 #[test]
232 fn result_set_is_send_sync() {
233 assert_send::<ResultSet>();
234 assert_sync::<ResultSet>();
235 }
236
237 #[test]
238 fn execute_result_is_send_sync() {
239 assert_send::<ExecuteResult>();
240 assert_sync::<ExecuteResult>();
241 }
242
243 #[test]
244 fn procedure_result_is_send_sync() {
245 assert_send::<ProcedureResult>();
246 assert_sync::<ProcedureResult>();
247 }
248
249 #[test]
250 fn procedure_builder_is_send_sync() {
251 assert_send::<ProcedureBuilder<'_, Ready>>();
252 assert_sync::<ProcedureBuilder<'_, Ready>>();
253 }
254
255 #[test]
257 fn bulk_insert_is_send_sync() {
258 assert_send::<BulkInsert>();
259 assert_sync::<BulkInsert>();
260 }
261
262 #[test]
263 fn bulk_insert_builder_is_send_sync() {
264 assert_send::<BulkInsertBuilder>();
265 assert_sync::<BulkInsertBuilder>();
266 }
267
268 #[test]
269 fn bulk_options_is_send_sync() {
270 assert_send::<BulkOptions>();
271 assert_sync::<BulkOptions>();
272 }
273
274 #[test]
276 fn cancel_handle_is_send_sync() {
277 assert_send::<CancelHandle>();
278 assert_sync::<CancelHandle>();
279 }
280
281 #[test]
283 fn row_is_send_sync() {
284 assert_send::<Row>();
285 assert_sync::<Row>();
286 }
287
288 #[test]
289 fn column_is_send_sync() {
290 assert_send::<Column>();
291 assert_sync::<Column>();
292 }
293
294 #[test]
296 fn statement_cache_is_send_sync() {
297 assert_send::<StatementCache>();
298 assert_sync::<StatementCache>();
299 }
300
301 #[test]
303 fn error_is_send_sync() {
304 assert_send::<Error>();
305 assert_sync::<Error>();
306 }
307}