rbdc_mysql/
stmt.rs

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/// Implementation of [`Arguments`] for MySQL.
23#[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}