#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
#![deny(unsafe_code)]
pub mod blob;
pub mod blob_stream;
pub(crate) mod browser;
pub mod bulk;
pub mod cancel;
pub mod change_tracking;
pub mod client;
#[cfg(feature = "always-encrypted")]
pub(crate) mod column_decryptor;
pub(crate) mod column_parser;
pub mod config;
pub mod encryption;
pub mod error;
#[cfg(all(windows, feature = "filestream"))]
#[allow(unsafe_code)] pub mod filestream;
pub mod from_row;
pub mod instrumentation;
pub(crate) mod plp;
pub mod procedure;
pub mod query;
pub mod row;
pub(crate) mod row_source;
pub mod row_stream;
pub mod state;
pub(crate) mod statement_cache;
pub mod stream;
pub mod to_params;
pub mod transaction;
pub mod tvp;
pub(crate) mod validation;
pub use bulk::{
BulkColumn, BulkInsert, BulkInsertBuilder, BulkInsertResult, BulkOptions, BulkWriter,
};
pub use cancel::CancelHandle;
pub use client::Client;
pub use config::{ApplicationIntent, Config, RedirectConfig, RetryPolicy, TimeoutConfig};
pub use error::{Error, SharedIoError};
pub use statement_cache::StatementCacheStats;
pub use mssql_auth::AuthError;
pub use mssql_codec::CodecError;
#[cfg(feature = "tls")]
pub use mssql_tls::TlsError;
pub use mssql_types::TypeError;
pub use tds_protocol::ProtocolError;
#[cfg(feature = "tls")]
pub use mssql_tls::{CertificateDer, TlsConfig};
#[cfg(feature = "always-encrypted")]
pub use mssql_auth::KeyStoreProvider;
pub use tds_protocol::token::Collation;
#[cfg(feature = "derive")]
pub use mssql_derive::{FromRow, ToParams, Tvp};
#[doc(hidden)]
pub mod __private {
pub use mssql_types::{ToSql, TypeError};
}
pub use from_row::{FromRow, MapRows, RowIteratorExt};
pub use mssql_auth::Credentials;
pub use tds_protocol::version::TdsVersion;
#[cfg(feature = "zeroize")]
pub use mssql_auth::{SecretString, SecureCredentials};
pub use mssql_types::{
Binary, Char, EncryptedParamType, FromSql, NChar, SqlTyped, SqlValue, ToSql, TypedNull, binary,
char, nchar, null,
};
#[cfg(feature = "chrono")]
pub use mssql_types::{
DateTime2, DateTimeLegacy, DateTimeOffset, SmallDateTime, Time, datetime, datetime2,
datetimeoffset, time,
};
#[cfg(feature = "decimal")]
pub use mssql_types::{Money, Numeric, SmallMoney, numeric};
pub use procedure::ProcedureBuilder;
pub use query::in_params;
pub use row::{Column, Row};
pub use state::{Connected, ConnectionState, Disconnected, InTransaction, ProtocolState, Ready};
#[cfg(feature = "fuzzing")]
#[doc(hidden)]
pub mod __fuzzing {
pub use crate::column_parser::parse_column_value;
}
#[cfg(feature = "bench")]
#[doc(hidden)]
#[allow(clippy::expect_used)]
pub mod __bench {
use bytes::Bytes;
use tds_protocol::token::{Token, TokenParser};
use crate::Ready;
use crate::client::Client;
use crate::row::Row;
#[must_use]
pub fn decode_buffered_response(bytes: Bytes) -> Vec<Row> {
let mut parser = TokenParser::new(bytes);
let mut row_meta = std::sync::Arc::new(crate::row::ColMetaData::new(Vec::new()));
let mut meta = None;
let mut rows = Vec::new();
while let Some(token) = parser
.next_token_with_metadata(meta.as_ref())
.expect("benchmark fixture must decode")
{
match token {
Token::ColMetaData(m) => {
row_meta = std::sync::Arc::new(crate::row::ColMetaData::new(
Client::<Ready>::build_columns(&m),
));
meta = Some(m);
}
Token::Row(raw) => {
let m = meta.as_ref().expect("ColMetaData precedes ROW tokens");
rows.push(
crate::column_parser::convert_raw_row(&raw, m, &row_meta)
.expect("benchmark row must convert"),
);
}
_ => {}
}
}
rows
}
}
pub use blob_stream::BlobStream;
pub use row_stream::RowStream;
pub use stream::{
ExecuteResult, MultiResultStream, OutputParam, ProcedureResult, QueryStream, ResultSet,
};
pub use to_params::{NamedParam, ParamList, ToParams};
pub use transaction::{IsolationLevel, SavePoint, Transaction};
pub use tvp::{Tvp, TvpColumn, TvpRow, TvpValue};
#[cfg(all(windows, feature = "filestream"))]
pub use filestream::{FileStream, FileStreamAccess, open_options as filestream_options};
pub use encryption::EncryptionConfig;
pub use instrumentation::{
DatabaseMetrics, OperationTimer, SanitizationConfig, attributes, metric_names, span_names,
};
pub use change_tracking::{
ChangeMetadata, ChangeOperation, ChangeTracking, ChangeTrackingQuery, SyncVersionStatus,
};
#[cfg(test)]
mod auto_trait_tests {
use super::*;
fn assert_send<T: Send>() {}
fn assert_sync<T: Sync>() {}
#[test]
fn client_ready_is_send_sync() {
assert_send::<Client<Ready>>();
assert_sync::<Client<Ready>>();
}
#[test]
fn client_in_transaction_is_send_sync() {
assert_send::<Client<InTransaction>>();
assert_sync::<Client<InTransaction>>();
}
#[test]
fn client_disconnected_is_send_sync() {
assert_send::<Client<Disconnected>>();
assert_sync::<Client<Disconnected>>();
}
#[test]
fn client_connected_is_send_sync() {
assert_send::<Client<Connected>>();
assert_sync::<Client<Connected>>();
}
#[test]
fn config_is_send_sync() {
assert_send::<Config>();
assert_sync::<Config>();
}
#[test]
fn query_stream_is_send_sync() {
assert_send::<QueryStream<'_>>();
assert_sync::<QueryStream<'_>>();
}
#[test]
fn row_stream_is_send_sync() {
assert_send::<RowStream<'_>>();
assert_sync::<RowStream<'_>>();
}
#[test]
fn blob_stream_is_send_sync() {
assert_send::<BlobStream<'_>>();
assert_sync::<BlobStream<'_>>();
}
#[test]
fn multi_result_stream_is_send_sync() {
assert_send::<MultiResultStream<'_>>();
assert_sync::<MultiResultStream<'_>>();
}
#[test]
fn result_set_is_send_sync() {
assert_send::<ResultSet>();
assert_sync::<ResultSet>();
}
#[test]
fn execute_result_is_send_sync() {
assert_send::<ExecuteResult>();
assert_sync::<ExecuteResult>();
}
#[test]
fn procedure_result_is_send_sync() {
assert_send::<ProcedureResult>();
assert_sync::<ProcedureResult>();
}
#[test]
fn procedure_builder_is_send_sync() {
assert_send::<ProcedureBuilder<'_, Ready>>();
assert_sync::<ProcedureBuilder<'_, Ready>>();
}
#[test]
fn bulk_insert_is_send_sync() {
assert_send::<BulkInsert>();
assert_sync::<BulkInsert>();
}
#[test]
fn bulk_insert_builder_is_send_sync() {
assert_send::<BulkInsertBuilder>();
assert_sync::<BulkInsertBuilder>();
}
#[test]
fn bulk_options_is_send_sync() {
assert_send::<BulkOptions>();
assert_sync::<BulkOptions>();
}
#[test]
fn cancel_handle_is_send_sync() {
assert_send::<CancelHandle>();
assert_sync::<CancelHandle>();
}
#[test]
fn row_is_send_sync() {
assert_send::<Row>();
assert_sync::<Row>();
}
#[test]
fn column_is_send_sync() {
assert_send::<Column>();
assert_sync::<Column>();
}
#[test]
fn statement_cache_is_send_sync() {
use crate::statement_cache::StatementCache;
assert_send::<StatementCache>();
assert_sync::<StatementCache>();
}
#[test]
fn error_is_send_sync() {
assert_send::<Error>();
assert_sync::<Error>();
}
}