|  | 
|  | 1 | +use crate::*; | 
|  | 2 | + | 
|  | 3 | +pub enum Value { | 
|  | 4 | +    Int(i32), | 
|  | 5 | +    Int64(i64), | 
|  | 6 | +    Float(f32), | 
|  | 7 | +    Double(f64), | 
|  | 8 | +    String(String), | 
|  | 9 | +} | 
|  | 10 | + | 
|  | 11 | +trait IntoValue { | 
|  | 12 | +    fn into_value(self) -> Result<Value>; | 
|  | 13 | +} | 
|  | 14 | + | 
|  | 15 | +macro_rules! impl_value { | 
|  | 16 | +    ($t: ty, $v: ident) => { | 
|  | 17 | +        impl IntoValue for $t { | 
|  | 18 | +            fn into_value(self) -> Result<Value> { | 
|  | 19 | +                Ok(Value::$v(self as _)) | 
|  | 20 | +            } | 
|  | 21 | +        } | 
|  | 22 | +    }; | 
|  | 23 | +} | 
|  | 24 | +impl_value!(i8, Int); | 
|  | 25 | +impl_value!(u8, Int); | 
|  | 26 | +impl_value!(i16, Int); | 
|  | 27 | +impl_value!(u16, Int); | 
|  | 28 | +impl_value!(i32, Int); | 
|  | 29 | +impl_value!(u32, Int); | 
|  | 30 | +impl_value!(u64, Int64); | 
|  | 31 | +impl_value!(i64, Int64); | 
|  | 32 | +impl_value!(f32, Float); | 
|  | 33 | +impl_value!(f64, Double); | 
|  | 34 | +impl_value!(String, String); | 
|  | 35 | + | 
|  | 36 | +impl IntoValue for &str { | 
|  | 37 | +    fn into_value(self) -> Result<Value> { | 
|  | 38 | +        Ok(Value::String(self.into())) | 
|  | 39 | +    } | 
|  | 40 | +} | 
|  | 41 | + | 
|  | 42 | +impl IntoValue for Value { | 
|  | 43 | +    fn into_value(self) -> Result<Value> { | 
|  | 44 | +        Ok(self) | 
|  | 45 | +    } | 
|  | 46 | +} | 
|  | 47 | + | 
|  | 48 | +pub enum Params { | 
|  | 49 | +    None, | 
|  | 50 | +    Positional(Vec<Value>), | 
|  | 51 | +} | 
|  | 52 | + | 
|  | 53 | +impl Params { | 
|  | 54 | +    pub(crate) unsafe fn bind(self, ptr: *mut xdb_stmt_t) -> Result<()> { | 
|  | 55 | +        if let Params::Positional(params) = self { | 
|  | 56 | +            for (i, p) in params.into_iter().enumerate() { | 
|  | 57 | +                let i = i as u16 + 1; | 
|  | 58 | +                let ret = match p { | 
|  | 59 | +                    ParamValue::Int(v) => xdb_bind_int(ptr, i, v), | 
|  | 60 | +                    ParamValue::Int64(v) => xdb_bind_int64(ptr, i, v), | 
|  | 61 | +                    ParamValue::Float(v) => xdb_bind_float(ptr, i, v), | 
|  | 62 | +                    ParamValue::Double(v) => xdb_bind_double(ptr, i, v), | 
|  | 63 | +                    ParamValue::String(v) => xdb_bind_str(ptr, i, CString::new(v)?.as_ptr()), | 
|  | 64 | +                }; | 
|  | 65 | +                if ret != 0 { | 
|  | 66 | +                    return Err(Error::BindParams); | 
|  | 67 | +                } | 
|  | 68 | +            } | 
|  | 69 | +        } | 
|  | 70 | +        Ok(()) | 
|  | 71 | +    } | 
|  | 72 | +} | 
|  | 73 | + | 
|  | 74 | +pub trait IntoParams { | 
|  | 75 | +    fn into_params(self) -> Result<Params>; | 
|  | 76 | +} | 
|  | 77 | + | 
|  | 78 | +impl IntoParams for () { | 
|  | 79 | +    fn into_params(self) -> Result<Params> { | 
|  | 80 | +        Ok(Params::None) | 
|  | 81 | +    } | 
|  | 82 | +} | 
|  | 83 | + | 
|  | 84 | +impl IntoParams for Params { | 
|  | 85 | +    fn into_params(self) -> Result<Params> { | 
|  | 86 | +        Ok(self) | 
|  | 87 | +    } | 
|  | 88 | +} | 
|  | 89 | + | 
|  | 90 | +impl<T: IntoValue> IntoParams for Vec<T> { | 
|  | 91 | +    fn into_params(self) -> Result<Params> { | 
|  | 92 | +        let mut params = Vec::with_capacity(self.len()); | 
|  | 93 | +        for param in self { | 
|  | 94 | +            params.push(param.into_value()?); | 
|  | 95 | +        } | 
|  | 96 | +        Ok(Params::Positional(params)) | 
|  | 97 | +    } | 
|  | 98 | +} | 
|  | 99 | + | 
|  | 100 | +impl<T: IntoValue + Clone> IntoParams for &[T] { | 
|  | 101 | +    fn into_params(self) -> Result<Params> { | 
|  | 102 | +        self.to_vec().into_params() | 
|  | 103 | +    } | 
|  | 104 | +} | 
|  | 105 | + | 
|  | 106 | +impl<T: IntoValue + Clone, const N: usize> IntoParams for &[T; N] { | 
|  | 107 | +    fn into_params(self) -> Result<Params> { | 
|  | 108 | +        self.to_vec().into_params() | 
|  | 109 | +    } | 
|  | 110 | +} | 
|  | 111 | + | 
|  | 112 | +// Copy from:https://github.com/tursodatabase/libsql/blob/main/libsql/src/params.rs#L206-L207 | 
|  | 113 | +macro_rules! tuple_into_params { | 
|  | 114 | +    ($count:literal : $(($field:tt $ftype:ident)),* $(,)?) => { | 
|  | 115 | +        impl<$($ftype,)*> IntoParams for ($($ftype,)*) where $($ftype: IntoValue,)* { | 
|  | 116 | +            fn into_params(self) -> Result<Params> { | 
|  | 117 | +                let params = Params::Positional(vec![$(self.$field.into_value()?),*]); | 
|  | 118 | +                Ok(params) | 
|  | 119 | +            } | 
|  | 120 | +        } | 
|  | 121 | +    } | 
|  | 122 | +} | 
|  | 123 | +tuple_into_params!(1: (0 A)); | 
|  | 124 | +tuple_into_params!(2: (0 A), (1 B)); | 
|  | 125 | +tuple_into_params!(3: (0 A), (1 B), (2 C)); | 
|  | 126 | +tuple_into_params!(4: (0 A), (1 B), (2 C), (3 D)); | 
|  | 127 | +tuple_into_params!(5: (0 A), (1 B), (2 C), (3 D), (4 E)); | 
|  | 128 | +tuple_into_params!(6: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F)); | 
|  | 129 | +tuple_into_params!(7: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G)); | 
|  | 130 | +tuple_into_params!(8: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H)); | 
|  | 131 | +tuple_into_params!(9: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H), (8 I)); | 
|  | 132 | +tuple_into_params!(10: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H), (8 I), (9 J)); | 
|  | 133 | +tuple_into_params!(11: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H), (8 I), (9 J), (10 K)); | 
|  | 134 | +tuple_into_params!(12: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H), (8 I), (9 J), (10 K), (11 L)); | 
|  | 135 | +tuple_into_params!(13: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H), (8 I), (9 J), (10 K), (11 L), (12 M)); | 
|  | 136 | +tuple_into_params!(14: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H), (8 I), (9 J), (10 K), (11 L), (12 M), (13 N)); | 
|  | 137 | +tuple_into_params!(15: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H), (8 I), (9 J), (10 K), (11 L), (12 M), (13 N), (14 O)); | 
|  | 138 | +tuple_into_params!(16: (0 A), (1 B), (2 C), (3 D), (4 E), (5 F), (6 G), (7 H), (8 I), (9 J), (10 K), (11 L), (12 M), (13 N), (14 O), (15 P)); | 
0 commit comments