use crate::encode::Encode;
use crate::{Firebird, FirebirdTypeInfo};
use sqlx_core::arguments::Arguments;
use sqlx_core::error::BoxDynError;
use sqlx_core::types::Type;
#[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() {
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()
}
}