Skip to content

Commit 65b3234

Browse files
committed
Add back in serde 0.3 support for back compat
This is a bit of a dubious hack since anyone that tries to turn on both serde and serde_json are screwed.
1 parent d3182d9 commit 65b3234

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ rustc-serialize = "0.3"
3232
net2 = { version = "0.2", features = ["nightly"] }
3333
chrono = { version = "0.2.14", optional = true }
3434
openssl = { version = "0.6.4", optional = true }
35+
serde = { version = "0.3", optional = true } # Delete for 0.11
3536
serde_json = { version = "0.6", optional = true }
3637
time = { version = "0.1.14", optional = true }
3738
unix_socket = { version = ">= 0.3, < 0.5", optional = true, features = ["socket_timeout"] }

src/types/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ mod slice;
5151
mod rustc_serialize;
5252
#[cfg(feature = "serde_json")]
5353
mod serde_json;
54+
#[cfg(feature = "serde")]
55+
mod serde;
5456
#[cfg(feature = "chrono")]
5557
mod chrono;
5658

src/types/serde.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
extern crate serde;
2+
3+
use std::error;
4+
use std::io::prelude::*;
5+
use byteorder::{ReadBytesExt, WriteBytesExt};
6+
use self::serde::json::{self, Value};
7+
8+
use Result;
9+
use error::Error;
10+
use types::{FromSql, ToSql, IsNull, Type, SessionInfo};
11+
12+
impl FromSql for Value {
13+
fn from_sql<R: Read>(ty: &Type, raw: &mut R, _: &SessionInfo) -> Result<Value> {
14+
if let Type::Jsonb = *ty {
15+
// We only support version 1 of the jsonb binary format
16+
if try!(raw.read_u8()) != 1 {
17+
let err: Box<error::Error+Sync+Send> = "unsupported JSONB encoding version".into();
18+
return Err(Error::Conversion(err));
19+
}
20+
}
21+
json::de::from_reader(raw).map_err(|err| Error::Conversion(Box::new(err)))
22+
}
23+
24+
accepts!(Type::Json, Type::Jsonb);
25+
}
26+
27+
impl ToSql for Value {
28+
fn to_sql<W: Write+?Sized>(&self, ty: &Type, mut out: &mut W, _: &SessionInfo)
29+
-> Result<IsNull> {
30+
if let Type::Jsonb = *ty {
31+
try!(out.write_u8(1));
32+
}
33+
34+
try!(write!(out, "{:?}", self));
35+
36+
Ok(IsNull::No)
37+
}
38+
39+
accepts!(Type::Json, Type::Jsonb);
40+
to_sql_checked!();
41+
}

0 commit comments

Comments
 (0)