Skip to main content

SqliteBindCollector

Struct SqliteBindCollector 

Source
pub struct SqliteBindCollector<'a> { /* private fields */ }
Available on crate features __sqlite-shared and i-implement-a-third-party-backend-and-opt-into-breaking-changes only.
Expand description

The BindCollector used by the SQLite backend.

You only interact with this when adding a third-party SQLite backend.

Implementations§

Source§

impl<'a> SqliteBindCollector<'a>

Source

pub fn new() -> Self

Construct an empty SqliteBindCollector

Source

pub fn binds( &self, ) -> impl ExactSizeIterator<Item = (&SqliteBindValueRef<'a>, SqliteType)>

Iterate over the collected bind values and their SQLite storage classes, in positional order.

Each yielded tuple carries a reference to the SqliteBindValueRef as it lives inside the collector, so borrowed string and blob variants are exposed without an intervening copy. If the caller needs a Send snapshot instead, use MoveableBindCollector::moveable and inspect SqliteBindCollectorData.

§Example

A third-party backend can render a typed Diesel query into placeholder SQL and recover the ordered bind values:

use diesel::expression::IntoSql;
use diesel::query_builder::{QueryBuilder, QueryFragment};
use diesel::sql_types::{BigInt, Integer, Text};
use diesel::sqlite::{
    Sqlite, SqliteBindCollector, SqliteBindValueRef, SqliteQueryBuilder, SqliteType,
};

fn render<Q: QueryFragment<Sqlite>>(query: &Q) -> (String, Vec<SqliteType>) {
    let mut qb = SqliteQueryBuilder::new();
    query.to_sql(&mut qb, &Sqlite).unwrap();

    let mut collector = SqliteBindCollector::new();
    query.collect_binds(&mut collector, &mut (), &Sqlite).unwrap();

    let binds: Vec<(&SqliteBindValueRef<'_>, SqliteType)> = collector.binds().collect();
    assert!(matches!(binds[0].0, SqliteBindValueRef::I32(1)));
    assert!(matches!(binds[1].0, SqliteBindValueRef::I64(2)));
    assert!(matches!(binds[2].0, SqliteBindValueRef::BorrowedString("hi")));

    (qb.finish(), binds.iter().map(|(_, t)| *t).collect())
}

let query = diesel::select((
    1_i32.into_sql::<Integer>(),
    2_i64.into_sql::<BigInt>(),
    "hi".into_sql::<Text>(),
));

let (sql, types) = render(&query);
assert!(sql.contains('?'));
assert_eq!(types, [SqliteType::Integer, SqliteType::Long, SqliteType::Text]);

Trait Implementations§

Source§

impl<'a> BindCollector<'a, Sqlite> for SqliteBindCollector<'a>

Source§

type Buffer = SqliteBindValue<'a>

The internal buffer type used by this bind collector
Source§

fn push_bound_value<T, U>( &mut self, bind: &'a U, metadata_lookup: &mut (), ) -> QueryResult<()>
where Sqlite: HasSqlType<T>, U: ToSql<T, Sqlite> + ?Sized,

Serializes the given bind value, and collects the result.
Source§

fn push_null_value(&mut self, metadata: SqliteType) -> QueryResult<()>

Push a null value with the given type information onto the bind collector
Source§

impl<'a> Debug for SqliteBindCollector<'a>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<'a> Default for SqliteBindCollector<'a>

Source§

fn default() -> SqliteBindCollector<'a>

Returns the “default value” for a type. Read more
Source§

impl MoveableBindCollector<Sqlite> for SqliteBindCollector<'_>

Source§

type BindData = SqliteBindCollectorData

Available on crate feature i-implement-a-third-party-backend-and-opt-into-breaking-changes only.
The movable bind data of this bind collector
Source§

fn moveable(&self) -> Self::BindData

Available on crate feature i-implement-a-third-party-backend-and-opt-into-breaking-changes only.
Builds a movable version of the bind collector
Source§

fn append_bind_data(&mut self, from: &Self::BindData)

Available on crate feature i-implement-a-third-party-backend-and-opt-into-breaking-changes only.
Refill the bind collector with its bind data
Source§

fn push_debug_binds<'a, 'b>( bind_data: &Self::BindData, f: &'a mut Vec<Box<dyn Debug + 'b>>, )

Available on crate feature i-implement-a-third-party-backend-and-opt-into-breaking-changes only.
Push bind data as debug representation

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