1use crate::protocol::text::ColumnType;
2use crate::result_set::{MySqlColumn, MySqlTypeInfo};
3use crate::types::{Encode, TypeInfo};
4use rbdc::ext::ustr::UStr;
5use rbdc::Error;
6use rbs::Value;
7use std::collections::HashMap;
8use std::sync::Arc;
9
10pub struct MySqlStatement {
11 pub sql: String,
12 pub metadata: MySqlStatementMetadata,
13}
14
15#[derive(Debug, Default, Clone)]
16pub struct MySqlStatementMetadata {
17 pub(crate) columns: Arc<Vec<MySqlColumn>>,
18 pub(crate) column_names: Arc<HashMap<UStr, (usize, MySqlTypeInfo)>>,
19 pub(crate) parameters: usize,
20}
21
22#[derive(Debug, Default, Clone)]
24pub struct MySqlArguments {
25 pub values: Vec<u8>,
26 pub types: Vec<MySqlTypeInfo>,
27 pub null_bitmap: Vec<u8>,
28}
29
30impl MySqlArguments {
31 pub fn add(&mut self, arg: Value) -> Result<(), Error> {
32 let index = self.types.len();
33 let ty = arg.type_info();
34 arg.encode(&mut self.values)?;
35 let is_null = ty.r#type.eq(&ColumnType::Null);
36 self.types.push(ty);
37 self.null_bitmap.resize((index / 8) + 1, 0);
38 if is_null {
39 self.null_bitmap[index / 8] |= (1 << (index % 8)) as u8;
40 }
41 Ok(())
42 }
43
44 #[doc(hidden)]
45 pub fn len(&self) -> usize {
46 self.types.len()
47 }
48}
49
50impl MySqlArguments {
51 pub fn from_args(args: Vec<Value>) -> Result<MySqlArguments, Error> {
52 let mut arg = MySqlArguments::default();
53 for x in args {
54 arg.add(x)?;
55 }
56 Ok(arg)
57 }
58}