Skip to content

Commit e9f5f5c

Browse files
committed
refactor(sqlite): Improve cloning of SqliteArgumentValue, SqliteArguments, and SqliteArgumentsBuffer
Signed-off-by: Joshua Potts <[email protected]>
1 parent f6b5958 commit e9f5f5c

File tree

5 files changed

+28
-21
lines changed

5 files changed

+28
-21
lines changed

sqlx-sqlite/src/any.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use sqlx_core::describe::Describe;
2020
use sqlx_core::executor::Executor;
2121
use sqlx_core::transaction::TransactionManager;
2222
use std::pin::pin;
23+
use std::sync::Arc;
2324

2425
sqlx_core::declare_driver_with_optional_migrate!(DRIVER = Sqlite);
2526

@@ -217,8 +218,8 @@ fn map_arguments(args: AnyArguments<'_>) -> SqliteArguments {
217218
AnyValueKind::BigInt(i) => SqliteArgumentValue::Int64(i),
218219
AnyValueKind::Real(r) => SqliteArgumentValue::Double(r as f64),
219220
AnyValueKind::Double(d) => SqliteArgumentValue::Double(d),
220-
AnyValueKind::Text(t) => SqliteArgumentValue::Text(t.to_string()),
221-
AnyValueKind::Blob(b) => SqliteArgumentValue::Blob(b.to_vec()),
221+
AnyValueKind::Text(t) => SqliteArgumentValue::Text(Arc::new(t.to_string())),
222+
AnyValueKind::Blob(b) => SqliteArgumentValue::Blob(Arc::new(b.to_vec())),
222223
// AnyValueKind is `#[non_exhaustive]` but we should have covered everything
223224
_ => unreachable!("BUG: missing mapping for {val:?}"),
224225
})

sqlx-sqlite/src/arguments.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@ use crate::statement::StatementHandle;
44
use crate::Sqlite;
55
use atoi::atoi;
66
use libsqlite3_sys::SQLITE_OK;
7+
use std::sync::Arc;
78

89
pub(crate) use sqlx_core::arguments::*;
910
use sqlx_core::error::BoxDynError;
1011

1112
#[derive(Debug, Clone)]
1213
pub enum SqliteArgumentValue {
1314
Null,
14-
Text(String),
15-
Blob(Vec<u8>),
15+
Text(Arc<String>),
16+
TextSlice(Arc<str>),
17+
Blob(Arc<Vec<u8>>),
1618
Double(f64),
1719
Int(i32),
1820
Int64(i64),
@@ -129,6 +131,7 @@ impl SqliteArgumentValue {
129131

130132
let status = match self {
131133
Text(v) => handle.bind_text(i, v),
134+
TextSlice(v) => handle.bind_text(i, v),
132135
Blob(v) => handle.bind_blob(i, v),
133136
Int(v) => handle.bind_int(i, *v),
134137
Int64(v) => handle.bind_int64(i, *v),

sqlx-sqlite/src/types/bytes.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ impl Type<Sqlite> for [u8] {
2222

2323
impl Encode<'_, Sqlite> for &'_ [u8] {
2424
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
25-
args.push(SqliteArgumentValue::Blob(self.to_vec()));
25+
args.push(SqliteArgumentValue::Blob(Arc::new(self.to_vec())));
2626

2727
Ok(IsNull::No)
2828
}
@@ -36,13 +36,13 @@ impl<'r> Decode<'r, Sqlite> for &'r [u8] {
3636

3737
impl Encode<'_, Sqlite> for Box<[u8]> {
3838
fn encode(self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
39-
args.push(SqliteArgumentValue::Blob(self.into_vec()));
39+
args.push(SqliteArgumentValue::Blob(Arc::new(self.into_vec())));
4040

4141
Ok(IsNull::No)
4242
}
4343

4444
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
45-
args.push(SqliteArgumentValue::Blob(self.clone().into_vec()));
45+
args.push(SqliteArgumentValue::Blob(Arc::new(self.clone().into_vec())));
4646

4747
Ok(IsNull::No)
4848
}
@@ -60,13 +60,13 @@ impl Type<Sqlite> for Vec<u8> {
6060

6161
impl Encode<'_, Sqlite> for Vec<u8> {
6262
fn encode(self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
63-
args.push(SqliteArgumentValue::Blob(self));
63+
args.push(SqliteArgumentValue::Blob(Arc::new(self)));
6464

6565
Ok(IsNull::No)
6666
}
6767

6868
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
69-
args.push(SqliteArgumentValue::Blob(self.clone()));
69+
args.push(SqliteArgumentValue::Blob(Arc::new(self.clone())));
7070

7171
Ok(IsNull::No)
7272
}
@@ -80,13 +80,13 @@ impl<'r> Decode<'r, Sqlite> for Vec<u8> {
8080

8181
impl Encode<'_, Sqlite> for Cow<'_, [u8]> {
8282
fn encode(self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
83-
args.push(SqliteArgumentValue::Blob(self.to_vec()));
83+
args.push(SqliteArgumentValue::Blob(Arc::new(self.into())));
8484

8585
Ok(IsNull::No)
8686
}
8787

8888
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
89-
args.push(SqliteArgumentValue::Blob(self.to_vec()));
89+
args.push(SqliteArgumentValue::Blob(Arc::new(self.to_vec())));
9090

9191
Ok(IsNull::No)
9292
}

sqlx-sqlite/src/types/str.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ impl Type<Sqlite> for str {
1818

1919
impl Encode<'_, Sqlite> for &'_ str {
2020
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
21-
args.push(SqliteArgumentValue::Text(self.to_string()));
21+
args.push(SqliteArgumentValue::Text(Arc::new(self.to_string())));
2222

2323
Ok(IsNull::No)
2424
}
@@ -32,13 +32,13 @@ impl<'r> Decode<'r, Sqlite> for &'r str {
3232

3333
impl Encode<'_, Sqlite> for Box<str> {
3434
fn encode(self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
35-
args.push(SqliteArgumentValue::Text(self.into_string()));
35+
args.push(SqliteArgumentValue::Text(Arc::new(String::from(self))));
3636

3737
Ok(IsNull::No)
3838
}
3939

4040
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
41-
args.push(SqliteArgumentValue::Text(self.to_string()));
41+
args.push(SqliteArgumentValue::Text(Arc::new(self.to_string())));
4242

4343
Ok(IsNull::No)
4444
}
@@ -52,13 +52,13 @@ impl Type<Sqlite> for String {
5252

5353
impl Encode<'_, Sqlite> for String {
5454
fn encode(self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
55-
args.push(SqliteArgumentValue::Text(self));
55+
args.push(SqliteArgumentValue::Text(Arc::new(self)));
5656

5757
Ok(IsNull::No)
5858
}
5959

6060
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
61-
args.push(SqliteArgumentValue::Text(self.clone()));
61+
args.push(SqliteArgumentValue::Text(Arc::new(self.clone())));
6262

6363
Ok(IsNull::No)
6464
}
@@ -72,13 +72,13 @@ impl<'r> Decode<'r, Sqlite> for String {
7272

7373
impl Encode<'_, Sqlite> for Cow<'_, str> {
7474
fn encode(self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
75-
args.push(SqliteArgumentValue::Text(self.into()));
75+
args.push(SqliteArgumentValue::Text(Arc::new(self.into())));
7676

7777
Ok(IsNull::No)
7878
}
7979

8080
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
81-
args.push(SqliteArgumentValue::Text(self.to_string()));
81+
args.push(SqliteArgumentValue::Text(Arc::new(self.to_string())));
8282

8383
Ok(IsNull::No)
8484
}

sqlx-sqlite/src/types/uuid.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::error::BoxDynError;
55
use crate::type_info::DataType;
66
use crate::types::Type;
77
use crate::{Sqlite, SqliteArgumentValue, SqliteTypeInfo, SqliteValueRef};
8+
use std::sync::Arc;
89
use uuid::{
910
fmt::{Hyphenated, Simple},
1011
Uuid,
@@ -22,7 +23,9 @@ impl Type<Sqlite> for Uuid {
2223

2324
impl Encode<'_, Sqlite> for Uuid {
2425
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
25-
args.push(SqliteArgumentValue::Blob(self.as_bytes().to_vec()));
26+
args.push(SqliteArgumentValue::Blob(Arc::new(
27+
self.as_bytes().to_vec(),
28+
)));
2629

2730
Ok(IsNull::No)
2831
}
@@ -43,7 +46,7 @@ impl Type<Sqlite> for Hyphenated {
4346

4447
impl Encode<'_, Sqlite> for Hyphenated {
4548
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
46-
args.push(SqliteArgumentValue::Text(self.to_string()));
49+
args.push(SqliteArgumentValue::Text(Arc::new(self.to_string())));
4750

4851
Ok(IsNull::No)
4952
}
@@ -66,7 +69,7 @@ impl Type<Sqlite> for Simple {
6669

6770
impl Encode<'_, Sqlite> for Simple {
6871
fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result<IsNull, BoxDynError> {
69-
args.push(SqliteArgumentValue::Text(self.to_string()));
72+
args.push(SqliteArgumentValue::Text(Arc::new(self.to_string())));
7073

7174
Ok(IsNull::No)
7275
}

0 commit comments

Comments
 (0)