1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use crate::*;
use libc::c_void;
pub trait ToSqlOut {
fn to_sql_output(&mut self, col_size: usize) -> (u16, *mut c_void, usize);
fn set_len(&mut self, _new_len: usize) { }
}
impl<T: ToSqlOut + ?Sized> ToSqlOut for &mut T {
fn to_sql_output(&mut self, col_size: usize) -> (u16, *mut c_void, usize) {
(*self).to_sql_output(col_size)
}
fn set_len(&mut self, new_len: usize) {
(*self).set_len(new_len)
}
}
macro_rules! impl_num_to_sql_output {
($($t:ty),+ => $sqlt:ident) => {
$(
impl ToSqlOut for $t {
fn to_sql_output(&mut self, _col_size: usize) -> (u16, *mut c_void, usize) {
($sqlt, self as *mut $t as *mut c_void, std::mem::size_of::<$t>())
}
}
)+
};
}
impl_num_to_sql_output!{ i8, i16, i32, i64, isize => SQLT_INT }
impl_num_to_sql_output!{ u8, u16, u32, u64, usize => SQLT_UIN }
impl_num_to_sql_output!{ f32 => SQLT_BFLOAT }
impl_num_to_sql_output!{ f64 => SQLT_BDOUBLE }
impl ToSqlOut for String {
fn to_sql_output(&mut self, _col_size: usize) -> (u16, *mut c_void, usize) {
(SQLT_CHR, unsafe { self.as_mut_vec().as_mut_ptr() } as *mut c_void, self.capacity())
}
fn set_len(&mut self, new_len: usize) {
unsafe { self.as_mut_vec().set_len(new_len) }
}
}
impl ToSqlOut for Vec<u8> {
fn to_sql_output(&mut self, _col_size: usize) -> (u16, *mut c_void, usize) {
(SQLT_LBI, self.as_mut_slice().as_mut_ptr() as *mut c_void, self.capacity())
}
fn set_len(&mut self, new_len: usize) {
unsafe { self.set_len(new_len) }
}
}