#[non_exhaustive]pub struct SqliteBindCollectorData { /* private fields */ }__sqlite-shared and i-implement-a-third-party-backend-and-opt-into-breaking-changes only.Expand description
SQLite bind collector data that is movable across threads.
This is the Send snapshot produced by MoveableBindCollector::moveable
on a SqliteBindCollector. Both borrowed and owned string or blob variants
of SqliteBindValueRef collapse into their OwnedSqliteBindValue
counterparts, so a caller crossing a thread boundary carries no borrows from
the original query. For a zero-copy view of the live collector see
SqliteBindCollector::binds.
Implementations§
Source§impl SqliteBindCollectorData
impl SqliteBindCollectorData
Sourcepub fn binds(
&self,
) -> impl ExactSizeIterator<Item = (&OwnedSqliteBindValue, SqliteType)>
pub fn binds( &self, ) -> impl ExactSizeIterator<Item = (&OwnedSqliteBindValue, SqliteType)>
Iterate over the collected bind values and their SQLite storage classes, in positional order.
The values yielded are the moved OwnedSqliteBindValue snapshot, so
this method is safe to call from any thread. For a zero-copy view of the
live collector see SqliteBindCollector::binds.
§Example
A third-party backend can snapshot the ordered bind values of a typed Diesel query and inspect the owned variants:
use diesel::expression::IntoSql;
use diesel::query_builder::{MoveableBindCollector, QueryFragment};
use diesel::sql_types::{Binary, Integer, Nullable, Text};
use diesel::sqlite::{
OwnedSqliteBindValue, Sqlite, SqliteBindCollector, SqliteBindCollectorData, SqliteType,
};
fn snapshot<Q: QueryFragment<Sqlite>>(query: &Q) -> SqliteBindCollectorData {
let mut collector = SqliteBindCollector::new();
query.collect_binds(&mut collector, &mut (), &Sqlite).unwrap();
collector.moveable()
}
let query = diesel::select((
42_i32.into_sql::<Integer>(),
"hi".into_sql::<Text>(),
vec![1_u8, 2, 3].into_sql::<Binary>(),
None::<i32>.into_sql::<Nullable<Integer>>(),
));
let data = snapshot(&query);
// Types survive the move.
let types: Vec<_> = data.binds().map(|(_, t)| t).collect();
assert_eq!(
types,
[SqliteType::Integer, SqliteType::Text, SqliteType::Binary, SqliteType::Integer],
);
// Borrowed variants normalize into their owned counterparts.
let binds: Vec<_> = data.binds().collect();
assert!(matches!(binds[0].0, OwnedSqliteBindValue::I32(42)));
assert!(matches!(binds[1].0, OwnedSqliteBindValue::String(s) if &**s == "hi"));
assert!(matches!(binds[2].0, OwnedSqliteBindValue::Binary(b) if **b == [1, 2, 3]));
assert!(matches!(binds[3].0, OwnedSqliteBindValue::Null));Trait Implementations§
Auto Trait Implementations§
impl Freeze for SqliteBindCollectorData
impl RefUnwindSafe for SqliteBindCollectorData
impl Send for SqliteBindCollectorData
impl Sync for SqliteBindCollectorData
impl Unpin for SqliteBindCollectorData
impl UnsafeUnpin for SqliteBindCollectorData
impl UnwindSafe for SqliteBindCollectorData
Blanket Implementations§
Source§impl<T> AggregateExpressionMethods for T
impl<T> AggregateExpressionMethods for T
Source§fn aggregate_distinct(self) -> AggregateDistinct<Self>where
Self: DistinctDsl,
fn aggregate_distinct(self) -> AggregateDistinct<Self>where
Self: DistinctDsl,
DISTINCT modifier for aggregate functions Read moreSource§fn aggregate_all(self) -> AggregateAll<Self>where
Self: AllDsl,
fn aggregate_all(self) -> AggregateAll<Self>where
Self: AllDsl,
ALL modifier for aggregate functions Read moreSource§fn aggregate_filter<P>(self, f: P) -> AggregateFilter<Self, P>
fn aggregate_filter<P>(self, f: P) -> AggregateFilter<Self, P>
Source§fn aggregate_order<O>(self, o: O) -> AggregateOrder<Self, O>where
Self: OrderAggregateDsl<O>,
fn aggregate_order<O>(self, o: O) -> AggregateOrder<Self, O>where
Self: OrderAggregateDsl<O>,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.