taos_query/stmt/
column.rs1use 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}