tiberius/tds/
codec.rs

1mod batch_request;
2mod bulk_load;
3mod column_data;
4mod decode;
5mod encode;
6mod guid;
7mod header;
8mod iterator_ext;
9mod login;
10mod packet;
11mod pre_login;
12mod rpc_request;
13mod token;
14mod type_info;
15
16pub use batch_request::*;
17pub use bulk_load::*;
18use bytes::BytesMut;
19pub use column_data::*;
20pub use decode::*;
21pub(crate) use encode::*;
22use futures_util::stream::{Stream, TryStreamExt};
23pub use header::*;
24pub(crate) use iterator_ext::*;
25pub use login::*;
26pub use packet::*;
27pub use pre_login::*;
28pub use rpc_request::*;
29pub use token::*;
30pub use type_info::*;
31
32const HEADER_BYTES: usize = 8;
33const ALL_HEADERS_LEN_TX: usize = 22;
34
35#[derive(Debug)]
36#[repr(u16)]
37#[allow(dead_code)]
38enum AllHeaderTy {
39    QueryDescriptor = 1,
40    TransactionDescriptor = 2,
41    TraceActivity = 3,
42}
43
44pub struct PacketCodec;
45
46pub(crate) async fn collect_from<S, T>(stream: &mut S) -> crate::Result<T>
47where
48    T: Decode<BytesMut> + Sized,
49    S: Stream<Item = crate::Result<Packet>> + Unpin,
50{
51    let mut buf = BytesMut::new();
52
53    while let Some(packet) = stream.try_next().await? {
54        let is_last = packet.is_last();
55        let (_, payload) = packet.into_parts();
56        buf.extend(payload);
57
58        if is_last {
59            break;
60        }
61    }
62
63    T::decode(&mut buf)
64}