sqlx-firebirdsql 0.1.0

Firebird SQL driver for SQLx
use crate::encode::Encode;
use crate::{Firebird, FirebirdTypeInfo};
use sqlx_core::arguments::Arguments;
use sqlx_core::error::BoxDynError;
use sqlx_core::types::Type;

/// Implementation of [`Arguments`] for Firebird.
#[derive(Debug, Default, Clone)]
pub struct FirebirdArguments {
    pub(crate) params: Vec<firebirust::Param>,
    pub(crate) types: Vec<FirebirdTypeInfo>,
}

impl FirebirdArguments {
    pub(crate) fn add<'q, T>(&mut self, value: T) -> Result<(), BoxDynError>
    where
        T: Encode<'q, Firebird> + Type<Firebird>,
    {
        let ty = value.produces().unwrap_or_else(T::type_info);
        let is_null = value.encode(&mut self.params)?;
        if is_null.is_null() {
            // Replace the last item with Null if encode said it was null
            if let Some(last) = self.params.last_mut() {
                *last = firebirust::Param::Null;
            }
        }
        self.types.push(ty);
        Ok(())
    }
}

impl Arguments for FirebirdArguments {
    type Database = Firebird;

    fn reserve(&mut self, len: usize, _size: usize) {
        self.types.reserve(len);
        self.params.reserve(len);
    }

    fn add<'t, T>(&mut self, value: T) -> Result<(), BoxDynError>
    where
        T: Encode<'t, Self::Database> + Type<Self::Database>,
    {
        self.add(value)
    }

    fn len(&self) -> usize {
        self.types.len()
    }
}