pub use crate::tds::stream::{QueryItem, ResultMetadata};
use crate::{
client::Connection,
tds::stream::{ReceivedToken, TokenStream},
};
use futures_util::io::{AsyncRead, AsyncWrite};
use futures_util::stream::TryStreamExt;
use std::fmt::Debug;
#[derive(Debug)]
pub struct ExecuteResult {
rows_affected: Vec<u64>,
}
impl<'a> ExecuteResult {
pub(crate) async fn new<S: AsyncRead + AsyncWrite + Unpin + Send>(
connection: &'a mut Connection<S>,
) -> crate::Result<Self> {
let mut token_stream = TokenStream::new(connection).try_unfold();
let mut rows_affected = Vec::new();
while let Some(token) = token_stream.try_next().await? {
match token {
ReceivedToken::DoneProc(done) if done.is_final() => (),
ReceivedToken::DoneProc(done) => rows_affected.push(done.rows()),
ReceivedToken::DoneInProc(done) => rows_affected.push(done.rows()),
ReceivedToken::Done(done) => rows_affected.push(done.rows()),
_ => (),
}
}
Ok(Self { rows_affected })
}
pub fn rows_affected(&self) -> &[u64] {
self.rows_affected.as_slice()
}
pub fn total(self) -> u64 {
self.rows_affected.into_iter().sum()
}
}
impl IntoIterator for ExecuteResult {
type Item = u64;
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.rows_affected.into_iter()
}
}