From 8b0df7ff3a4139db9f9ed71ea9d0bc82eca3eb30 Mon Sep 17 00:00:00 2001 From: Joel Galenson Date: Tue, 28 Jul 2020 13:34:02 -0700 Subject: Import rusqlite-0.23.1 Change-Id: Id1ca7bcaad7820f463bfcce6945d80fc1d6918f5 --- src/types/serde_json.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/types/serde_json.rs (limited to 'src/types/serde_json.rs') diff --git a/src/types/serde_json.rs b/src/types/serde_json.rs new file mode 100644 index 0000000..abaecda --- /dev/null +++ b/src/types/serde_json.rs @@ -0,0 +1,60 @@ +//! `ToSql` and `FromSql` implementation for JSON `Value`. + +use serde_json::Value; + +use crate::types::{FromSql, FromSqlError, FromSqlResult, ToSql, ToSqlOutput, ValueRef}; +use crate::Result; + +/// Serialize JSON `Value` to text. +impl ToSql for Value { + fn to_sql(&self) -> Result> { + Ok(ToSqlOutput::from(serde_json::to_string(self).unwrap())) + } +} + +/// Deserialize text/blob to JSON `Value`. +impl FromSql for Value { + fn column_result(value: ValueRef<'_>) -> FromSqlResult { + match value { + ValueRef::Text(s) => serde_json::from_slice(s), + ValueRef::Blob(b) => serde_json::from_slice(b), + _ => return Err(FromSqlError::InvalidType), + } + .map_err(|err| FromSqlError::Other(Box::new(err))) + } +} + +#[cfg(test)] +mod test { + use crate::types::ToSql; + use crate::{Connection, NO_PARAMS}; + + fn checked_memory_handle() -> Connection { + let db = Connection::open_in_memory().unwrap(); + db.execute_batch("CREATE TABLE foo (t TEXT, b BLOB)") + .unwrap(); + db + } + + #[test] + fn test_json_value() { + let db = checked_memory_handle(); + + let json = r#"{"foo": 13, "bar": "baz"}"#; + let data: serde_json::Value = serde_json::from_str(json).unwrap(); + db.execute( + "INSERT INTO foo (t, b) VALUES (?, ?)", + &[&data as &dyn ToSql, &json.as_bytes()], + ) + .unwrap(); + + let t: serde_json::Value = db + .query_row("SELECT t FROM foo", NO_PARAMS, |r| r.get(0)) + .unwrap(); + assert_eq!(data, t); + let b: serde_json::Value = db + .query_row("SELECT b FROM foo", NO_PARAMS, |r| r.get(0)) + .unwrap(); + assert_eq!(data, b); + } +} -- cgit v1.2.3