Skip to content

Commit 0370edd

Browse files
committed
Fix string params bind
1 parent 935671a commit 0370edd

File tree

4 files changed

+36
-30
lines changed

4 files changed

+36
-30
lines changed

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,17 +234,17 @@ mod tests {
234234

235235
let row1 = query.fetch_row().unwrap();
236236
assert_eq!(row1.get(0), &Value::I32(1));
237-
// assert_eq!(row1.get(1), &Value::String("Alex"));
237+
assert_eq!(row1.get(1), &Value::String("Alex"));
238238
assert_eq!(row1.get(2), &Value::I32(18));
239239

240240
let row2 = query.fetch_row().unwrap();
241241
assert_eq!(row2.get(0), &Value::I32(2));
242-
// assert_eq!(row2.get(1), &Value::String("Thorne"));
242+
assert_eq!(row2.get(1), &Value::String("Thorne"));
243243
assert_eq!(row2.get(2), &Value::I32(22));
244244

245245
let row3 = query.fetch_row().unwrap();
246246
assert_eq!(row3.get(0), &Value::I32(3));
247-
// assert_eq!(row3.get(1), &Value::String("Ryder"));
247+
assert_eq!(row3.get(1), &Value::String("Ryder"));
248248
assert_eq!(row3.get(2), &Value::I32(36));
249249

250250
assert!(query.fetch_row().is_none());

src/params.rs

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pub enum Value {
55
Int64(i64),
66
Float(f32),
77
Double(f64),
8-
String(String),
8+
String(CString),
99
}
1010

1111
trait IntoValue {
@@ -31,11 +31,22 @@ impl_value!(u64, Int64);
3131
impl_value!(i64, Int64);
3232
impl_value!(f32, Float);
3333
impl_value!(f64, Double);
34-
impl_value!(String, String);
34+
35+
impl IntoValue for String {
36+
fn into_value(self) -> Result<Value> {
37+
Ok(Value::String(CString::new(self)?))
38+
}
39+
}
3540

3641
impl IntoValue for &str {
3742
fn into_value(self) -> Result<Value> {
38-
Ok(Value::String(self.into()))
43+
Ok(Value::String(CString::new(self)?))
44+
}
45+
}
46+
47+
impl IntoValue for CString {
48+
fn into_value(self) -> Result<Value> {
49+
Ok(Value::String(self))
3950
}
4051
}
4152

@@ -50,25 +61,6 @@ pub enum Params {
5061
Positional(Vec<Value>),
5162
}
5263

53-
impl Params {
54-
pub(crate) unsafe fn bind(ptr: *mut xdb_stmt_t, params: Vec<Value>) -> Result<()> {
55-
for (i, p) in params.into_iter().enumerate() {
56-
let i = i as u16 + 1;
57-
let ret = match p {
58-
ParamValue::Int(v) => xdb_bind_int(ptr, i, v),
59-
ParamValue::Int64(v) => xdb_bind_int64(ptr, i, v),
60-
ParamValue::Float(v) => xdb_bind_float(ptr, i, v),
61-
ParamValue::Double(v) => xdb_bind_double(ptr, i, v),
62-
ParamValue::String(v) => xdb_bind_str(ptr, i, CString::new(v)?.as_ptr()),
63-
};
64-
if ret != 0 {
65-
return Err(Error::BindParams);
66-
}
67-
}
68-
Ok(())
69-
}
70-
}
71-
7264
pub trait IntoParams {
7365
fn into_params(self) -> Result<Params>;
7466
}

src/statement.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,24 @@ impl Statement {
1818
pub fn query(&self, params: impl IntoParams) -> Result<Query> {
1919
unsafe {
2020
let params = params.into_params()?;
21-
if let Params::Positional(params) = params {
22-
if !params.is_empty() {
23-
self.clear_bindings()?;
24-
Params::bind(self.ptr, params)?;
21+
// Here we use the &params
22+
// Ensure that 'ParamValue::String' is not released before 'xdb_stmt_exec'.
23+
if let Params::Positional(params) = &params {
24+
self.clear_bindings()?;
25+
for (i, p) in params.iter().enumerate() {
26+
let i = i as u16 + 1;
27+
let ret = match p {
28+
ParamValue::Int(v) => xdb_bind_int(self.ptr, i, *v),
29+
ParamValue::Int64(v) => xdb_bind_int64(self.ptr, i, *v),
30+
ParamValue::Float(v) => xdb_bind_float(self.ptr, i, *v),
31+
ParamValue::Double(v) => xdb_bind_double(self.ptr, i, *v),
32+
ParamValue::String(v) => {
33+
xdb_bind_str2(self.ptr, i, v.as_ptr(), v.as_bytes().len() as i32)
34+
}
35+
};
36+
if ret != 0 {
37+
return Err(Error::BindParams);
38+
}
2539
}
2640
}
2741
let ptr = xdb_stmt_exec(self.ptr);

0 commit comments

Comments
 (0)