taos_query/stmt/
column.rs

1use std::os::raw::{c_char, c_int, c_void};
2
3use crate::common::{itypes::IsValue, Ty};
4
5#[repr(C)]
6#[derive(Debug, Clone)]
7pub struct RawMultiBind {
8    pub buffer_type: c_int,
9    pub buffer: *const c_void,
10    pub buffer_length: usize,
11    pub length: *const i32,
12    pub is_null: *const c_char,
13    pub num: c_int,
14}
15
16impl RawMultiBind {
17    pub fn new(ty: Ty) -> Self {
18        Self {
19            buffer_type: ty as _,
20            buffer: std::ptr::null_mut(),
21            buffer_length: 0,
22            length: std::ptr::null_mut(),
23            is_null: std::ptr::null_mut(),
24            num: 1,
25        }
26    }
27}
28
29pub trait BindFrom: Sized {
30    fn null() -> Self;
31    fn from_primitive<T: IsValue>(v: &T) -> Self;
32    fn from_timestamp(v: i64) -> Self;
33    fn from_varchar(v: &str) -> Self;
34    fn from_nchar(v: &str) -> Self;
35    fn from_json(v: &str) -> Self;
36    fn from_binary(v: &str) -> Self {
37        Self::from_varchar(v)
38    }
39}
40
41fn box_into_raw<T>(v: T) -> *mut T {
42    Box::into_raw(Box::new(v))
43}
44
45impl BindFrom for RawMultiBind {
46    #[inline]
47    fn null() -> Self {
48        RawMultiBind {
49            buffer_type: Ty::Null as _,
50            buffer_length: 0,
51            buffer: std::ptr::null_mut(),
52            length: std::ptr::null_mut(),
53            is_null: std::ptr::null_mut(),
54            num: 1 as _,
55        }
56    }
57
58    fn from_primitive<T: IsValue>(v: &T) -> Self {
59        let mut param = RawMultiBind::new(T::TY);
60        param.buffer_length = T::TY.fixed_length();
61        param.buffer = box_into_raw(v.clone()) as *const T as _;
62        param.length = box_into_raw(param.buffer_length) as _;
63        param.is_null = box_into_raw(0) as _;
64        param
65    }
66
67    fn from_timestamp(v: i64) -> Self {
68        let mut param = RawMultiBind::new(Ty::Timestamp);
69        param.buffer_length = std::mem::size_of::<i64>();
70        param.buffer = box_into_raw(v) as _;
71        param.length = box_into_raw(param.buffer_length) as _;
72        param.is_null = box_into_raw(0i8) as _;
73        param
74    }
75
76    fn from_varchar(v: &str) -> Self {
77        let mut param = RawMultiBind::new(Ty::VarChar);
78        param.buffer_length = v.len();
79        param.buffer = v.as_ptr() as _;
80        param.length = box_into_raw(param.buffer_length) as _;
81        param.is_null = box_into_raw(0i8) as _;
82        param
83    }
84    fn from_json(v: &str) -> Self {
85        let mut param = RawMultiBind::new(Ty::Json);
86        param.buffer_length = v.len();
87        param.buffer = v.as_ptr() as _;
88        param.length = box_into_raw(param.buffer_length) as _;
89        param.is_null = box_into_raw(0i8) as _;
90        param
91    }
92    fn from_nchar(v: &str) -> Self {
93        let mut param = RawMultiBind::new(Ty::NChar);
94        param.buffer_length = v.len();
95        param.buffer = v.as_ptr() as _;
96        param.length = box_into_raw(param.buffer_length) as _;
97        param.is_null = box_into_raw(0i8) as _;
98        param
99    }
100}