|
1 |
| -use crate::ffi::{duckdb_destroy_value, duckdb_get_int64, duckdb_get_varchar, duckdb_value}; |
2 |
| -use std::{ffi::CString, fmt}; |
| 1 | +use crate::ffi::{duckdb_destroy_value, duckdb_free, duckdb_get_int64, duckdb_get_varchar, duckdb_value}; |
| 2 | +use std::{ffi::CStr, fmt, os::raw::c_void}; |
3 | 3 |
|
4 | 4 | /// The Value object holds a single arbitrary value of any type that can be
|
5 | 5 | /// stored in the database.
|
@@ -34,7 +34,27 @@ impl Value {
|
34 | 34 |
|
35 | 35 | impl fmt::Display for Value {
|
36 | 36 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
37 |
| - let c_string = unsafe { CString::from_raw(duckdb_get_varchar(self.ptr)) }; |
38 |
| - write!(f, "{}", c_string.to_str().unwrap()) |
| 37 | + unsafe { |
| 38 | + let varchar = duckdb_get_varchar(self.ptr); |
| 39 | + let c_str = CStr::from_ptr(varchar); |
| 40 | + let res = write!(f, "{}", c_str.to_string_lossy()); |
| 41 | + duckdb_free(varchar as *mut c_void); |
| 42 | + res |
| 43 | + } |
| 44 | + } |
| 45 | +} |
| 46 | + |
| 47 | +#[cfg(test)] |
| 48 | +mod tests { |
| 49 | + use super::*; |
| 50 | + use crate::ffi::duckdb_create_varchar; |
| 51 | + use std::ffi::CString; |
| 52 | + |
| 53 | + #[test] |
| 54 | + fn test_value_to_string() { |
| 55 | + let c_str = CString::new("some value").unwrap(); |
| 56 | + let duckdb_val = unsafe { duckdb_create_varchar(c_str.as_ptr()) }; |
| 57 | + let val = Value::from(duckdb_val); |
| 58 | + assert_eq!(val.to_string(), "some value"); |
39 | 59 | }
|
40 | 60 | }
|
0 commit comments