From 3b67ff8c0cf6ab43d3c41661a8282d2f6346d61e Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Thu, 8 Jul 2021 01:58:01 +0800 Subject: [PATCH] Support Decimal on sqlite --- src/executor/query.rs | 56 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/executor/query.rs b/src/executor/query.rs index e10e7553..2c10d0b6 100644 --- a/src/executor/query.rs +++ b/src/executor/query.rs @@ -160,5 +160,59 @@ try_getable_mysql!(u64); try_getable_all!(f32); try_getable_all!(f64); try_getable_all!(String); + #[cfg(feature = "with-rust_decimal")] -try_getable_mysql!(rust_decimal::Decimal); +use rust_decimal::Decimal; + +#[cfg(feature = "with-rust_decimal")] +impl TryGetable for Decimal { + fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result { + let column = format!("{}{}", pre, col); + match &res.row { + #[cfg(feature = "sqlx-mysql")] + QueryResultRow::SqlxMySql(row) => { + use sqlx::Row; + row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err) + } + #[cfg(feature = "sqlx-sqlite")] + QueryResultRow::SqlxSqlite(row) => { + use sqlx::Row; + let val: f64 = row.try_get(column.as_str()).map_err(crate::sqlx_error_to_query_err)?; + use rust_decimal::prelude::FromPrimitive; + Decimal::from_f64(val).ok_or_else(|| DbErr::Query("Failed to convert f64 into Decimal".to_owned())) + } + #[cfg(feature = "mock")] + QueryResultRow::Mock(row) => Ok(row.try_get(column.as_str())?), + } + } +} + +#[cfg(feature = "with-rust_decimal")] +impl TryGetable for Option { + fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result { + let column = format!("{}{}", pre, col); + match &res.row { + #[cfg(feature = "sqlx-mysql")] + QueryResultRow::SqlxMySql(row) => { + use sqlx::Row; + match row.try_get(column.as_str()) { + Ok(v) => Ok(Some(v)), + Err(_) => Ok(None), + } + } + #[cfg(feature = "sqlx-sqlite")] + QueryResultRow::SqlxSqlite(_) => { + let result: Result = TryGetable::try_get(res, pre, col); + match result { + Ok(v) => Ok(Some(v)), + Err(_) => Ok(None), + } + } + #[cfg(feature = "mock")] + QueryResultRow::Mock(row) => match row.try_get(column.as_str()) { + Ok(v) => Ok(Some(v)), + Err(_) => Ok(None), + }, + } + } +}