mirror of
				https://github.com/isar/rusqlite.git
				synced 2025-10-31 05:48:56 +08:00 
			
		
		
		
	Do not assume sqlite3_column_text is valid UTF-8.
				
					
				
			Fix Statement::value_ref
This commit is contained in:
		| @@ -14,7 +14,7 @@ pub enum ValueRef<'a> { | ||||
|     /// The value is a floating point number. | ||||
|     Real(f64), | ||||
|     /// The value is a text string. | ||||
|     Text(&'a str), | ||||
|     Text(&'a [u8]), | ||||
|     /// The value is a blob of data | ||||
|     Blob(&'a [u8]), | ||||
| } | ||||
| @@ -54,7 +54,10 @@ impl<'a> ValueRef<'a> { | ||||
|     /// `Err(Error::InvalidColumnType)`. | ||||
|     pub fn as_str(&self) -> FromSqlResult<&'a str> { | ||||
|         match *self { | ||||
|             ValueRef::Text(t) => Ok(t), | ||||
|             ValueRef::Text(t) => match std::str::from_utf8(t) { | ||||
|                 Err(e) => Err(FromSqlError::Other(Box::new(e))), | ||||
|                 Ok(r) => Ok(r), | ||||
|             }, | ||||
|             _ => Err(FromSqlError::InvalidType), | ||||
|         } | ||||
|     } | ||||
| @@ -75,7 +78,10 @@ impl From<ValueRef<'_>> for Value { | ||||
|             ValueRef::Null => Value::Null, | ||||
|             ValueRef::Integer(i) => Value::Integer(i), | ||||
|             ValueRef::Real(r) => Value::Real(r), | ||||
|             ValueRef::Text(s) => Value::Text(s.to_string()), | ||||
|             ValueRef::Text(s) => { | ||||
|                 let s = std::str::from_utf8(s).expect("invalid UTF-8"); | ||||
|                 Value::Text(s.to_string()) | ||||
|             } | ||||
|             ValueRef::Blob(b) => Value::Blob(b.to_vec()), | ||||
|         } | ||||
|     } | ||||
| @@ -83,7 +89,7 @@ impl From<ValueRef<'_>> for Value { | ||||
|  | ||||
| impl<'a> From<&'a str> for ValueRef<'a> { | ||||
|     fn from(s: &str) -> ValueRef<'_> { | ||||
|         ValueRef::Text(s) | ||||
|         ValueRef::Text(s.as_bytes()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -99,7 +105,7 @@ impl<'a> From<&'a Value> for ValueRef<'a> { | ||||
|             Value::Null => ValueRef::Null, | ||||
|             Value::Integer(i) => ValueRef::Integer(i), | ||||
|             Value::Real(r) => ValueRef::Real(r), | ||||
|             Value::Text(ref s) => ValueRef::Text(s), | ||||
|             Value::Text(ref s) => ValueRef::Text(s.as_bytes()), | ||||
|             Value::Blob(ref b) => ValueRef::Blob(b), | ||||
|         } | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user