use rust_ef::provider::DbValue;
#[cfg(feature = "tracing")]
use sqlx::Column;
use sqlx::Row;
pub(crate) fn cell_to_db_value(row: &sqlx::mysql::MySqlRow, col_idx: usize) -> DbValue {
if let Ok(v) = row.try_get::<Option<bool>, _>(col_idx) {
return v.map(DbValue::Bool).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<i16>, _>(col_idx) {
return v.map(DbValue::I16).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<i32>, _>(col_idx) {
return v.map(DbValue::I32).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<i64>, _>(col_idx) {
return v.map(DbValue::I64).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<f32>, _>(col_idx) {
return v.map(DbValue::F32).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<f64>, _>(col_idx) {
return v.map(DbValue::F64).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<chrono::NaiveDateTime>, _>(col_idx) {
return v.map(DbValue::NaiveDateTime).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<chrono::NaiveDate>, _>(col_idx) {
return v.map(DbValue::NaiveDate).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<uuid::Uuid>, _>(col_idx) {
return v.map(DbValue::Uuid).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<String>, _>(col_idx) {
return v.map(DbValue::String).unwrap_or(DbValue::Null);
}
if let Ok(v) = row.try_get::<Option<Vec<u8>>, _>(col_idx) {
return v.map(DbValue::Bytes).unwrap_or(DbValue::Null);
}
#[cfg(feature = "tracing")]
{
let col_name = row
.columns()
.get(col_idx)
.map(|c| c.name())
.unwrap_or("unknown");
tracing::warn!(
column = col_name,
index = col_idx,
"MySQL column type unrecognized, returning NULL"
);
}
DbValue::Null
}