From 06bb8bb06c8813c6435536ac2c60ecd2e5f168f1 Mon Sep 17 00:00:00 2001 From: bilalshemsu9 Date: Tue, 15 Sep 2026 07:19:26 -0900 Subject: [PATCH] fix(backend): add support for DECIMAL, SMALLINT, TINYINT, and raw ValueRef decoding in MySQL and SQLite --- src-tauri/src/commands/mod.rs | 102 ++++++++++++++++++++++++++++++++++ src-tauri/src/export.rs | 78 ++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index 4f9525a..3089b60 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -113,9 +113,24 @@ pub(crate) fn mysql_value_to_string(row: &MySqlRow, index: usize, column_name: & if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } @@ -140,6 +155,18 @@ pub(crate) fn mysql_value_to_string(row: &MySqlRow, index: usize, column_name: & if let Ok(value) = row.try_get::>, _>(index) { return Ok(value.map(|v| decode_mysql_bytes_as_string(&v))); } + if let Ok(val_ref) = row.try_get_raw(index) { + use sqlx::ValueRef; + if val_ref.is_null() { + return Ok(None); + } + if let Ok(s) = val_ref.as_str() { + return Ok(Some(s.to_string())); + } + if let Ok(b) = val_ref.as_bytes() { + return Ok(Some(decode_mysql_bytes_as_string(b))); + } + } Err(mysql_decode_error(context, column_name, Some(index), "unsupported value type")) } @@ -162,9 +189,24 @@ pub(crate) fn mysql_value_to_display_string( if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } @@ -189,6 +231,18 @@ pub(crate) fn mysql_value_to_display_string( if let Ok(value) = row.try_get::>, _>(index) { return Ok(value.map(|v| format!("0x{}", hex::encode(v)))); } + if let Ok(val_ref) = row.try_get_raw(index) { + use sqlx::ValueRef; + if val_ref.is_null() { + return Ok(None); + } + if let Ok(s) = val_ref.as_str() { + return Ok(Some(s.to_string())); + } + if let Ok(b) = val_ref.as_bytes() { + return Ok(Some(decode_mysql_bytes_as_string(b))); + } + } Err(mysql_decode_error(context, column_name, Some(index), "unsupported value type")) } @@ -213,15 +267,63 @@ pub(crate) fn sqlite_value_to_string(row: &SqliteRow, index: usize, column_name: if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string())); } + if let Ok(value) = row.try_get::>, _>(index) { + return Ok(value.map(|v| v.format("%Y-%m-%d %H:%M:%S").to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.format("%Y-%m-%d %H:%M:%S").to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string())); + } if let Ok(value) = row.try_get::>, _>(index) { return Ok(value.map(|v| format!("0x{}", hex::encode(v)))); } + if let Ok(val_ref) = row.try_get_raw(index) { + use sqlx::ValueRef; + if val_ref.is_null() { + return Ok(None); + } + if let Ok(s) = val_ref.as_str() { + return Ok(Some(s.to_string())); + } + if let Ok(b) = val_ref.as_bytes() { + return Ok(Some(String::from_utf8_lossy(b).to_string())); + } + } Err(sqlite_decode_error(context, column_name, Some(index), "unsupported value type")) } diff --git a/src-tauri/src/export.rs b/src-tauri/src/export.rs index 04b8150..46e7568 100644 --- a/src-tauri/src/export.rs +++ b/src-tauri/src/export.rs @@ -607,12 +607,30 @@ fn mysql_value_to_string(row: &MySqlRow, index: usize, column_name: &str, contex if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string()).unwrap_or_default()); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string()).unwrap_or_default()); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string()).unwrap_or_default()); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string()).unwrap_or_default()); } @@ -633,6 +651,18 @@ fn mysql_value_to_string(row: &MySqlRow, index: usize, column_name: &str, contex .map(|v| format!("0x{}", hex::encode(v))) .unwrap_or_default()); } + if let Ok(val_ref) = row.try_get_raw(index) { + use sqlx::ValueRef; + if val_ref.is_null() { + return Ok(String::new()); + } + if let Ok(s) = val_ref.as_str() { + return Ok(s.to_string()); + } + if let Ok(b) = val_ref.as_bytes() { + return Ok(String::from_utf8_lossy(b).to_string()); + } + } Err(format!( "MySQL decode error in {} at column '{}' (index {}): unsupported value type", context, column_name, index @@ -646,17 +676,65 @@ fn sqlite_value_to_string(row: &SqliteRow, index: usize, column_name: &str, cont if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string()).unwrap_or_default()); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string()).unwrap_or_default()); } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } if let Ok(value) = row.try_get::, _>(index) { return Ok(value.map(|v| v.to_string()).unwrap_or_default()); } + if let Ok(value) = row.try_get::>, _>(index) { + return Ok(value.map(|v| v.format("%Y-%m-%d %H:%M:%S").to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.format("%Y-%m-%d %H:%M:%S").to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } + if let Ok(value) = row.try_get::, _>(index) { + return Ok(value.map(|v| v.to_string()).unwrap_or_default()); + } if let Ok(value) = row.try_get::>, _>(index) { return Ok(value .map(|v| format!("0x{}", hex::encode(v))) .unwrap_or_default()); } + if let Ok(val_ref) = row.try_get_raw(index) { + use sqlx::ValueRef; + if val_ref.is_null() { + return Ok(String::new()); + } + if let Ok(s) = val_ref.as_str() { + return Ok(s.to_string()); + } + if let Ok(b) = val_ref.as_bytes() { + return Ok(String::from_utf8_lossy(b).to_string()); + } + } Err(format!( "SQLite decode error in {} at column '{}' (index {}): unsupported value type", context, column_name, index