Skip to main content

SqliteBindCollectorData

Struct SqliteBindCollectorData 

Source
#[non_exhaustive]
pub struct SqliteBindCollectorData { /* private fields */ }
Available on crate features __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

Source

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§

Source§

impl Debug for SqliteBindCollectorData

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> AggregateExpressionMethods for T

Source§

fn aggregate_distinct(self) -> AggregateDistinct<Self>
where Self: DistinctDsl,

DISTINCT modifier for aggregate functions Read more
Source§

fn aggregate_all(self) -> AggregateAll<Self>
where Self: AllDsl,

ALL modifier for aggregate functions Read more
Source§

fn aggregate_filter<P>(self, f: P) -> AggregateFilter<Self, P>
where P: AsExpression<Bool>, Self: FilterDsl<P::Expression>,

Add an aggregate function filter Read more
Source§

fn aggregate_order<O>(self, o: O) -> AggregateOrder<Self, O>
where Self: OrderAggregateDsl<O>,

Add an aggregate function order Read more
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoSql for T

Source§

fn into_sql<T>(self) -> AsExprOf<Self, T>

Convert self to an expression for Diesel’s query builder. Read more
Source§

fn as_sql<'a, T>(&'a self) -> AsExprOf<&'a Self, T>
where &'a Self: AsExpression<T>, T: SqlType + TypedExpressionType,

Convert &self to an expression for Diesel’s query builder. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WindowExpressionMethods for T

Source§

fn over(self) -> Over<Self>
where Self: OverDsl,

Turn a function call into a window function call Read more
Source§

fn window_filter<P>(self, f: P) -> WindowFilter<Self, P>
where P: AsExpression<Bool>, Self: FilterDsl<P::Expression>,

Add a filter to the current window function Read more
Source§

fn partition_by<E>(self, expr: E) -> PartitionBy<Self, E>
where Self: PartitionByDsl<E>,

Add a partition clause to the current window function Read more
Source§

fn window_order<E>(self, expr: E) -> WindowOrder<Self, E>
where Self: OrderWindowDsl<E>,

Add a order clause to the current window function Read more
Source§

fn frame_by<E>(self, expr: E) -> FrameBy<Self, E>
where Self: FrameDsl<E>,

Add a frame clause to the current window function Read more