#[derive(Debug, Default, Clone, PartialEq, Eq)]
pub struct QueryResult {
rows_affected: u64,
last_insert_rowid: Option<i64>,
}
impl QueryResult {
#[must_use]
pub fn new(rows_affected: u64, last_insert_rowid: Option<i64>) -> Self {
Self {
rows_affected,
last_insert_rowid,
}
}
#[must_use]
pub fn rows_affected(&self) -> u64 {
self.rows_affected
}
#[must_use]
pub fn last_insert_rowid(&self) -> Option<i64> {
self.last_insert_rowid
}
}
impl Extend<QueryResult> for QueryResult {
fn extend<T: IntoIterator<Item = QueryResult>>(&mut self, iter: T) {
for result in iter {
self.rows_affected += result.rows_affected;
self.last_insert_rowid = result.last_insert_rowid.or(self.last_insert_rowid);
}
}
}
#[derive(Debug, Clone)]
pub struct BatchResult<R> {
rows: Vec<R>,
result: QueryResult,
}
impl<R> BatchResult<R> {
#[must_use]
pub fn new(rows: Vec<R>, result: QueryResult) -> Self {
Self { rows, result }
}
#[must_use]
pub fn rows(&self) -> &[R] {
&self.rows
}
#[must_use]
pub fn into_rows(self) -> Vec<R> {
self.rows
}
#[must_use]
pub fn result(&self) -> &QueryResult {
&self.result
}
#[must_use]
pub fn into_parts(self) -> (Vec<R>, QueryResult) {
(self.rows, self.result)
}
}
#[cfg(test)]
mod tests {
use super::QueryResult;
#[test]
fn extend_sums_changes_and_keeps_the_last_reported_rowid() {
let mut result = QueryResult::default();
result.extend([
QueryResult::new(2, Some(7)),
QueryResult::new(1, Some(9)),
QueryResult::new(0, None),
]);
assert_eq!(result.rows_affected(), 3);
assert_eq!(result.last_insert_rowid(), Some(9));
}
}