From f87a956ede77bf123c483e671b08be574e315430 Mon Sep 17 00:00:00 2001 From: David Cornu Date: Fri, 6 Jun 2025 15:22:11 -0400 Subject: [PATCH 1/4] Introduce `debug_row` function --- sqlx-core/src/row.rs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/sqlx-core/src/row.rs b/sqlx-core/src/row.rs index fe0b75ebb0..6077b9a640 100644 --- a/sqlx-core/src/row.rs +++ b/sqlx-core/src/row.rs @@ -1,8 +1,9 @@ -use crate::column::ColumnIndex; +use crate::column::{Column, ColumnIndex}; use crate::database::Database; use crate::decode::Decode; use crate::error::{mismatched_types, Error}; +use crate::type_checking::TypeChecking; use crate::type_info::TypeInfo; use crate::types::Type; use crate::value::ValueRef; @@ -176,3 +177,32 @@ pub trait Row: Unpin + Send + Sync + 'static { where I: ColumnIndex; } + +pub fn debug_row(row: &R, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result +where + R: Row, + usize: ColumnIndex, + ::Database: TypeChecking, +{ + write!(f, "{} ", std::any::type_name::())?; + + let mut debug_map = f.debug_map(); + + for column in row.columns().iter() { + match row.try_get_raw(column.ordinal()) { + Ok(value) => { + debug_map.entry( + &column.name(), + &::Database::fmt_value_debug( + &<::Database as Database>::ValueRef::to_owned(&value), + ), + ); + } + Err(error) => { + debug_map.entry(&column.name(), &format!("decode error: {error:?}")); + } + } + } + + debug_map.finish() +} From 72487087479271852a62f492c1bf49442aa6ad54 Mon Sep 17 00:00:00 2001 From: David Cornu Date: Fri, 6 Jun 2025 15:22:11 -0400 Subject: [PATCH 2/4] Use `debug_row` to implement `Debug` for `SqliteRow` --- sqlx-sqlite/src/row.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sqlx-sqlite/src/row.rs b/sqlx-sqlite/src/row.rs index 92fc455819..3cb47efec8 100644 --- a/sqlx-sqlite/src/row.rs +++ b/sqlx-sqlite/src/row.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use sqlx_core::column::ColumnIndex; use sqlx_core::error::Error; use sqlx_core::ext::ustr::UStr; -use sqlx_core::row::Row; +use sqlx_core::row::{debug_row, Row}; use sqlx_core::HashMap; use crate::statement::StatementHandle; @@ -77,6 +77,12 @@ impl ColumnIndex for &'_ str { } } +impl std::fmt::Debug for SqliteRow { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + debug_row(self, f) + } +} + // #[cfg(feature = "any")] // impl From for crate::any::AnyRow { // #[inline] From 2002b2d6fbef1a58dfc6d0861065cb2deb0d4eaf Mon Sep 17 00:00:00 2001 From: David Cornu Date: Fri, 6 Jun 2025 15:22:11 -0400 Subject: [PATCH 3/4] Use `debug_row` in `PgRow`'s `Debug` implementation --- sqlx-postgres/src/row.rs | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/sqlx-postgres/src/row.rs b/sqlx-postgres/src/row.rs index f9e43bb9c6..5240a50be0 100644 --- a/sqlx-postgres/src/row.rs +++ b/sqlx-postgres/src/row.rs @@ -4,10 +4,8 @@ use crate::message::DataRow; use crate::statement::PgStatementMetadata; use crate::value::PgValueFormat; use crate::{PgColumn, PgValueRef, Postgres}; +use sqlx_core::row::debug_row; pub(crate) use sqlx_core::row::Row; -use sqlx_core::type_checking::TypeChecking; -use sqlx_core::value::ValueRef; -use std::fmt::Debug; use std::sync::Arc; /// Implementation of [`Row`] for PostgreSQL. @@ -51,25 +49,8 @@ impl ColumnIndex for &'_ str { } } -impl Debug for PgRow { +impl std::fmt::Debug for PgRow { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "PgRow ")?; - - let mut debug_map = f.debug_map(); - for (index, column) in self.columns().iter().enumerate() { - match self.try_get_raw(index) { - Ok(value) => { - debug_map.entry( - &column.name, - &Postgres::fmt_value_debug(&::to_owned(&value)), - ); - } - Err(error) => { - debug_map.entry(&column.name, &format!("decode error: {error:?}")); - } - } - } - - debug_map.finish() + debug_row(self, f) } } From 3ba1b0b5bed607d0da0cb703bcf2da0f5c95940f Mon Sep 17 00:00:00 2001 From: David Cornu Date: Fri, 6 Jun 2025 15:22:11 -0400 Subject: [PATCH 4/4] Match `MySqlRow`'s `Debug` implementation --- sqlx-mysql/src/row.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sqlx-mysql/src/row.rs b/sqlx-mysql/src/row.rs index e7191366e6..7bed7c7726 100644 --- a/sqlx-mysql/src/row.rs +++ b/sqlx-mysql/src/row.rs @@ -9,7 +9,6 @@ use crate::HashMap; use crate::{protocol, MySql, MySqlColumn, MySqlValueFormat, MySqlValueRef}; /// Implementation of [`Row`] for MySQL. -#[derive(Debug)] pub struct MySqlRow { pub(crate) row: protocol::Row, pub(crate) format: MySqlValueFormat, @@ -49,3 +48,9 @@ impl ColumnIndex for &'_ str { .copied() } } + +impl std::fmt::Debug for MySqlRow { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + debug_row(self, f) + } +}