sqlx_exasol_impl/arguments/
mod.rs1#[cfg(feature = "geo-types")]
2mod geo_types;
3#[cfg(feature = "json")]
4mod json;
5
6use serde::Serialize;
7use serde_json::Error as SerdeError;
8use sqlx_core::{arguments::Arguments, encode::Encode, error::BoxDynError, types::Type};
9
10use crate::{database::Exasol, error::ExaProtocolError, type_info::ExaTypeInfo};
11
12#[derive(Debug, Default)]
14pub struct ExaArguments {
15 pub buf: ExaBuffer,
16 pub types: Vec<ExaTypeInfo>,
17}
18
19impl Arguments for ExaArguments {
20 type Database = Exasol;
21
22 fn reserve(&mut self, additional: usize, size: usize) {
23 self.types.reserve(additional);
24 self.buf.buffer.reserve(size);
25 }
26
27 fn add<'t, T>(&mut self, value: T) -> Result<(), BoxDynError>
28 where
29 T: Encode<'t, Self::Database> + Type<Self::Database>,
30 {
31 let ty = value.produces().unwrap_or_else(T::type_info);
32
33 self.buf.start_seq();
34 let _ = value.encode(&mut self.buf)?;
35 self.buf.end_seq();
36 self.buf.add_separator();
37
38 self.buf.check_param_count()?;
39
40 self.types.push(ty);
41
42 Ok(())
43 }
44
45 fn len(&self) -> usize {
46 self.types.len()
47 }
48}
49
50#[derive(Debug)]
52pub struct ExaBuffer {
53 pub(crate) buffer: String,
58 pub(crate) col_params_counter: usize,
64 pub(crate) first_col_params_num: Option<usize>,
68}
69
70impl ExaBuffer {
71 pub fn append<T>(&mut self, value: T) -> Result<(), SerdeError>
73 where
74 T: Serialize,
75 {
76 self.col_params_counter += 1;
77 serde_json::to_writer(unsafe { self.buffer.as_mut_vec() }, &value)
79 }
80
81 pub fn append_iter<'q, I, T>(&mut self, iter: I) -> Result<(), BoxDynError>
83 where
84 I: IntoIterator<Item = T>,
85 T: 'q + Encode<'q, Exasol>,
86 {
87 let mut iter = iter.into_iter();
88
89 if let Some(value) = iter.next() {
90 let _ = value.encode(self)?;
91 }
92
93 for value in iter {
94 self.add_separator();
95 let _ = value.encode(self)?;
96 }
97
98 Ok(())
99 }
100
101 pub(crate) fn num_param_sets(&self) -> usize {
103 self.first_col_params_num.unwrap_or_default()
104 }
105
106 pub(crate) fn finish(mut self) -> String {
108 self.buffer.pop();
110 self.end_seq();
111 self.buffer
112 }
113
114 fn start_seq(&mut self) {
116 self.buffer.push('[');
117 }
118
119 fn end_seq(&mut self) {
121 self.buffer.push(']');
122 }
123
124 fn add_separator(&mut self) {
126 self.buffer.push(',');
127 }
128
129 fn check_param_count(&mut self) -> Result<(), ExaProtocolError> {
136 let count = self.col_params_counter;
137
138 self.col_params_counter = 0;
140
141 match self.first_col_params_num {
142 Some(n) if n == count => (),
143 Some(n) => Err(ExaProtocolError::ParameterLengthMismatch(count, n))?,
144 None => self.first_col_params_num = Some(count),
145 }
146
147 Ok(())
148 }
149}
150
151impl Default for ExaBuffer {
152 fn default() -> Self {
153 let mut buffer = Self {
154 buffer: String::with_capacity(1),
155 col_params_counter: 0,
156 first_col_params_num: None,
157 };
158
159 buffer.start_seq();
160 buffer
161 }
162}