From 1c461ed19929b26d20a239299b41ade90e0e63df Mon Sep 17 00:00:00 2001 From: Dany Gagnon Date: Sat, 21 Dec 2024 21:57:34 -0500 Subject: [PATCH 1/3] feat: add merge capability for arguments --- sqlx-core/src/any/arguments.rs | 4 ++++ sqlx-core/src/arguments.rs | 2 ++ sqlx-mysql/src/arguments.rs | 7 +++++++ sqlx-postgres/src/arguments.rs | 5 +++++ sqlx-sqlite/src/arguments.rs | 4 ++++ 5 files changed, 22 insertions(+) diff --git a/sqlx-core/src/any/arguments.rs b/sqlx-core/src/any/arguments.rs index 59a0c0f765..4fb1a67b3a 100644 --- a/sqlx-core/src/any/arguments.rs +++ b/sqlx-core/src/any/arguments.rs @@ -28,6 +28,10 @@ impl<'q> Arguments<'q> for AnyArguments<'q> { fn len(&self) -> usize { self.values.0.len() } + + fn merge(&mut self, other: Self) { + self.values.0.extend(other.values.0); + } } pub struct AnyArgumentBuffer<'q>(#[doc(hidden)] pub Vec>); diff --git a/sqlx-core/src/arguments.rs b/sqlx-core/src/arguments.rs index 4bf826ed31..b224010334 100644 --- a/sqlx-core/src/arguments.rs +++ b/sqlx-core/src/arguments.rs @@ -27,6 +27,8 @@ pub trait Arguments<'q>: Send + Sized + Default { fn format_placeholder(&self, writer: &mut W) -> fmt::Result { writer.write_str("?") } + + fn merge(&mut self, other: Self); } pub trait IntoArguments<'q, DB: Database>: Sized + Send { diff --git a/sqlx-mysql/src/arguments.rs b/sqlx-mysql/src/arguments.rs index 464529cba2..8c81256a7a 100644 --- a/sqlx-mysql/src/arguments.rs +++ b/sqlx-mysql/src/arguments.rs @@ -55,6 +55,13 @@ impl<'q> Arguments<'q> for MySqlArguments { fn len(&self) -> usize { self.types.len() } + + fn merge(&mut self, other: Self) { + self.types.extend(other.types); + self.values.extend(other.values); + self.null_bitmap.bytes.extend(other.null_bitmap.bytes); + self.null_bitmap.length += other.null_bitmap.length; + } } #[derive(Debug, Default, Clone)] diff --git a/sqlx-postgres/src/arguments.rs b/sqlx-postgres/src/arguments.rs index bc7e861c52..358400792b 100644 --- a/sqlx-postgres/src/arguments.rs +++ b/sqlx-postgres/src/arguments.rs @@ -145,6 +145,11 @@ impl<'q> Arguments<'q> for PgArguments { write!(writer, "${}", self.buffer.count) } + fn merge(&mut self, other: Self) { + self.types.extend(other.types); + self.buffer.extend_from_slice(&other.buffer); + } + #[inline(always)] fn len(&self) -> usize { self.buffer.count diff --git a/sqlx-sqlite/src/arguments.rs b/sqlx-sqlite/src/arguments.rs index 410b4caa99..b8177f78cf 100644 --- a/sqlx-sqlite/src/arguments.rs +++ b/sqlx-sqlite/src/arguments.rs @@ -72,6 +72,10 @@ impl<'q> Arguments<'q> for SqliteArguments<'q> { fn len(&self) -> usize { self.values.len() } + + fn merge(&mut self, other: Self) { + self.values.extend(other.values); + } } impl SqliteArguments<'_> { From 31c6bf494efb1cea7f3cafab9a8fa685c9abe3b9 Mon Sep 17 00:00:00 2001 From: Dany Gagnon Date: Sat, 21 Dec 2024 22:16:38 -0500 Subject: [PATCH 2/3] feat: add count and types to merge --- sqlx-core/src/arguments.rs | 2 +- sqlx-postgres/src/arguments.rs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sqlx-core/src/arguments.rs b/sqlx-core/src/arguments.rs index b224010334..6f830e8e57 100644 --- a/sqlx-core/src/arguments.rs +++ b/sqlx-core/src/arguments.rs @@ -28,7 +28,7 @@ pub trait Arguments<'q>: Send + Sized + Default { writer.write_str("?") } - fn merge(&mut self, other: Self); + fn merge(mut self, other: Self); } pub trait IntoArguments<'q, DB: Database>: Sized + Send { diff --git a/sqlx-postgres/src/arguments.rs b/sqlx-postgres/src/arguments.rs index 358400792b..ce56ce41e1 100644 --- a/sqlx-postgres/src/arguments.rs +++ b/sqlx-postgres/src/arguments.rs @@ -148,6 +148,9 @@ impl<'q> Arguments<'q> for PgArguments { fn merge(&mut self, other: Self) { self.types.extend(other.types); self.buffer.extend_from_slice(&other.buffer); + self.buffer.count += other.buffer.count; + self.buffer.patches.extend(other.buffer.patches); + self.buffer.type_holes.extend(other.buffer.type_holes); } #[inline(always)] From fc7a7dec7bcaf26003e35300a69c74ddcca863b8 Mon Sep 17 00:00:00 2001 From: Dany Gagnon Date: Sat, 21 Dec 2024 22:18:32 -0500 Subject: [PATCH 3/3] feat: take as mut borrow --- sqlx-core/src/arguments.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlx-core/src/arguments.rs b/sqlx-core/src/arguments.rs index 6f830e8e57..b224010334 100644 --- a/sqlx-core/src/arguments.rs +++ b/sqlx-core/src/arguments.rs @@ -28,7 +28,7 @@ pub trait Arguments<'q>: Send + Sized + Default { writer.write_str("?") } - fn merge(mut self, other: Self); + fn merge(&mut self, other: Self); } pub trait IntoArguments<'q, DB: Database>: Sized + Send {