mirror of
https://github.com/isar/rusqlite.git
synced 2024-11-22 16:29:20 +08:00
Do not assume sqlite3_column_text
is valid UTF-8.
Fix Statement::value_ref
This commit is contained in:
parent
b7882380b2
commit
f78ac1f2cf
@ -221,7 +221,7 @@ impl<'stmt> Row<'stmt> {
|
||||
/// 16 bytes, `Error::InvalidColumnType` will also be returned.
|
||||
pub fn get<I: RowIndex, T: FromSql>(&self, idx: I) -> Result<T> {
|
||||
let idx = idx.idx(self.stmt)?;
|
||||
let value = self.stmt.value_ref(idx);
|
||||
let value = self.stmt.value_ref(idx)?;
|
||||
FromSql::column_result(value).map_err(|err| match err {
|
||||
FromSqlError::InvalidType => {
|
||||
Error::InvalidColumnType(idx, self.stmt.column_name(idx).into(), value.data_type())
|
||||
@ -262,7 +262,7 @@ impl<'stmt> Row<'stmt> {
|
||||
// returns) to `ValueRef<'a>` is needed because it's only valid until
|
||||
// the next call to sqlite3_step.
|
||||
let val_ref = self.stmt.value_ref(idx);
|
||||
Ok(val_ref)
|
||||
val_ref
|
||||
}
|
||||
|
||||
/// Get the value of a particular column of the result row as a `ValueRef`,
|
||||
|
@ -601,10 +601,10 @@ impl Statement<'_> {
|
||||
Statement { conn, stmt }
|
||||
}
|
||||
|
||||
pub(crate) fn value_ref(&self, col: usize) -> ValueRef<'_> {
|
||||
pub(crate) fn value_ref(&self, col: usize) -> Result<ValueRef<'_>> {
|
||||
let raw = unsafe { self.stmt.ptr() };
|
||||
|
||||
match self.stmt.column_type(col) {
|
||||
Ok(match self.stmt.column_type(col) {
|
||||
ffi::SQLITE_NULL => ValueRef::Null,
|
||||
ffi::SQLITE_INTEGER => {
|
||||
ValueRef::Integer(unsafe { ffi::sqlite3_column_int64(raw, col as c_int) })
|
||||
@ -624,8 +624,7 @@ impl Statement<'_> {
|
||||
|
||||
// sqlite3_column_text returns UTF8 data, so our unwrap here should be fine.
|
||||
let s = s
|
||||
.to_str()
|
||||
.expect("sqlite3_column_text returned invalid UTF-8");
|
||||
.to_str()?;
|
||||
ValueRef::Text(s)
|
||||
}
|
||||
ffi::SQLITE_BLOB => {
|
||||
@ -653,7 +652,7 @@ impl Statement<'_> {
|
||||
}
|
||||
}
|
||||
_ => unreachable!("sqlite3_column_type returned invalid value"),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub(crate) fn step(&self) -> Result<bool> {
|
||||
|
Loading…
Reference in New Issue
Block a user