chain_builder/
sqlx_mysql.rs

1use crate::ChainBuilder;
2use serde_json::Value;
3use sqlx::{self, mysql::MySqlArguments, Arguments, Row};
4
5impl ChainBuilder {
6    fn value_to_arguments(&self, binds: &Vec<Value>) -> MySqlArguments {
7        let mut arguments: MySqlArguments = MySqlArguments::default();
8        for bind in binds {
9            match bind {
10                serde_json::Value::String(v) => {
11                    // qb = qb.bind(v);
12                    let _ = arguments.add(v);
13                }
14                serde_json::Value::Number(v) => {
15                    if v.is_f64() {
16                        // qb = qb.bind(v.as_f64().unwrap_or(0.0));
17                        let _ = arguments.add(v.as_f64().unwrap_or(0.0));
18                    } else if v.is_u64() {
19                        // qb = qb.bind(v.as_u64().unwrap_or(0));
20                        let _ = arguments.add(v.as_u64().unwrap_or(0));
21                    } else if v.is_i64() {
22                        // qb = qb.bind(v.as_i64().unwrap_or(0));
23                        let _ = arguments.add(v.as_i64().unwrap_or(0));
24                    } else {
25                        // qb = qb.bind(v.to_string());
26                        let _ = arguments.add(v.to_string());
27                    }
28                }
29                serde_json::Value::Bool(v) => {
30                    // qb = qb.bind(v);
31                    let _ = arguments.add(v);
32                }
33                serde_json::Value::Null => {
34                    let null_data: Option<Value> = None;
35                    // qb = qb.bind(null_data);
36                    let _ = arguments.add(null_data);
37                }
38                serde_json::Value::Object(v) => {
39                    let to_string = serde_json::to_string(&v).unwrap_or_default();
40                    // qb = qb.bind(to_string);
41                    let _ = arguments.add(to_string);
42                }
43                _ => {
44                    // qb = qb.bind(bind);
45                    let _ = arguments.add(bind);
46                }
47            }
48        }
49        arguments
50    }
51
52    pub fn to_sqlx_query(
53        &mut self,
54    ) -> sqlx::query::Query<'_, sqlx::MySql, sqlx::mysql::MySqlArguments> {
55        let (_, binds) = self.to_sql();
56        sqlx::query_with(self.sql_str.as_str(), self.value_to_arguments(&binds))
57    }
58
59    pub fn to_sqlx_query_as<T>(
60        &mut self,
61    ) -> sqlx::query::QueryAs<'_, sqlx::MySql, T, sqlx::mysql::MySqlArguments>
62    where
63        T: for<'r> sqlx::FromRow<'r, sqlx::mysql::MySqlRow>,
64    {
65        let (_, binds) = self.to_sql();
66        sqlx::query_as_with(self.sql_str.as_str(), self.value_to_arguments(&binds))
67    }
68
69    pub async fn count(
70        &mut self,
71        column: &str,
72        pool: &sqlx::Pool<sqlx::MySql>,
73    ) -> Result<i64, sqlx::Error> {
74        let (_, binds) = self.to_sql();
75        let sql = self.sql_str.as_str();
76        let sql = format!("SELECT COUNT({}) FROM ({}) as count", column, sql);
77        let qb = sqlx::query_with(&sql, self.value_to_arguments(&binds));
78        let query_count = qb.fetch_one(pool).await?;
79        let count: i64 = query_count.try_get(0)?;
80        Ok(count)
81    }
82}