chain_builder/
sqlx_mysql.rs1use 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 let _ = arguments.add(v);
13 }
14 serde_json::Value::Number(v) => {
15 if v.is_f64() {
16 let _ = arguments.add(v.as_f64().unwrap_or(0.0));
18 } else if v.is_u64() {
19 let _ = arguments.add(v.as_u64().unwrap_or(0));
21 } else if v.is_i64() {
22 let _ = arguments.add(v.as_i64().unwrap_or(0));
24 } else {
25 let _ = arguments.add(v.to_string());
27 }
28 }
29 serde_json::Value::Bool(v) => {
30 let _ = arguments.add(v);
32 }
33 serde_json::Value::Null => {
34 let null_data: Option<Value> = None;
35 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 let _ = arguments.add(to_string);
42 }
43 _ => {
44 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}