Skip to main content

sqlx_cloudflare_core/
arguments.rs

1use sqlx_core::database::Database;
2use sqlx_core::encode::{Encode, IsNull};
3use sqlx_core::error::BoxDynError;
4use sqlx_core::types::Type;
5
6use crate::Value;
7
8/// Encodes `value` onto `values`, as one placeholder's worth.
9///
10/// What a driver's `Arguments::add` does: whatever the encoder does, exactly
11/// one value lands for the placeholder, or none if it fails.
12///
13/// # Errors
14///
15/// When encoding fails, in which case `values` is left as it was.
16pub fn add_argument<'t, DB, T>(values: &mut Vec<Value>, value: T) -> Result<(), BoxDynError>
17where
18    DB: Database<ArgumentBuffer = Vec<Value>>,
19    T: Encode<'t, DB> + Type<DB>,
20{
21    let len = values.len();
22
23    match value.encode(values) {
24        Ok(IsNull::Yes) => {
25            // An encoder that reports NULL may still have pushed something;
26            // the placeholder must line up with exactly one value.
27            values.truncate(len);
28            values.push(Value::Null);
29        }
30        Ok(IsNull::No) => {}
31        Err(error) => {
32            // Leave the arguments as they were, so a failed bind cannot shift
33            // every later parameter one placeholder to the right.
34            values.truncate(len);
35            return Err(error);
36        }
37    }
38
39    Ok(())
40}