Skip to content

Commit 1767661

Browse files
committed
Redesign ToSql and remove RawToSql
1 parent 2380165 commit 1767661

7 files changed

Lines changed: 224 additions & 280 deletions

File tree

src/lib.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ use url::Url;
7676
pub use error::{Error, ConnectError, SqlState, DbError, ErrorPosition};
7777
#[doc(inline)]
7878
pub use types::{Oid, Type, Kind, ToSql, FromSql};
79+
use types::IsNull;
7980
#[doc(inline)]
8081
pub use types::Slice;
8182
use io::{InternalStream, Timeout};
@@ -727,12 +728,17 @@ impl InnerConnection {
727728
}
728729

729730
// Ew @ doing this manually :(
731+
let mut buf = vec![];
732+
let value = match try!(oid.to_sql_checked(&Type::Oid, &mut buf)) {
733+
IsNull::Yes => None,
734+
IsNull::No => Some(buf),
735+
};
730736
try!(self.write_messages(&[
731737
Bind {
732738
portal: "",
733739
statement: TYPEINFO_QUERY,
734740
formats: &[1],
735-
values: &[try!(oid.to_sql(&Type::Oid))],
741+
values: &[value],
736742
result_formats: &[1]
737743
},
738744
Execute {
@@ -1319,7 +1325,11 @@ impl<'conn> Statement<'conn> {
13191325
params.len());
13201326
let mut values = vec![];
13211327
for (param, ty) in params.iter().zip(self.param_types.iter()) {
1322-
values.push(try!(param.to_sql(ty)));
1328+
let mut buf = vec![];
1329+
match try!(param.to_sql_checked(ty, &mut buf)) {
1330+
IsNull::Yes => values.push(None),
1331+
IsNull::No => values.push(Some(buf)),
1332+
}
13231333
};
13241334

13251335
try!(conn.write_messages(&[
@@ -2054,13 +2064,14 @@ impl<'a> CopyInStatement<'a> {
20542064
loop {
20552065
match (row.next(), types.next()) {
20562066
(Some(val), Some(ty)) => {
2057-
match val.to_sql(ty) {
2058-
Ok(None) => {
2067+
let mut inner_buf = vec![];
2068+
match val.to_sql_checked(ty, &mut inner_buf) {
2069+
Ok(IsNull::Yes) => {
20592070
let _ = buf.write_be_i32(-1);
20602071
}
2061-
Ok(Some(val)) => {
2062-
let _ = buf.write_be_i32(val.len() as i32);
2063-
let _ = buf.write_all(&val);
2072+
Ok(IsNull::No) => {
2073+
let _ = buf.write_be_i32(inner_buf.len() as i32);
2074+
let _ = buf.write_all(&inner_buf);
20642075
}
20652076
Err(err) => {
20662077
// FIXME this is not the right way to handle this

src/types/json.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use serialize::json;
22

33
use {Result, Error};
4-
use types::{FromSql, RawToSql, Type};
4+
use types::{FromSql, ToSql, IsNull, Type};
55

66
impl FromSql for json::Json {
77
fn from_sql<R: Reader>(ty: &Type, raw: &mut R) -> Result<json::Json> {
@@ -17,14 +17,17 @@ impl FromSql for json::Json {
1717
accepts!(Type::Json, Type::Jsonb);
1818
}
1919

20-
impl RawToSql for json::Json {
21-
fn raw_to_sql<W: Writer>(&self, ty: &Type, raw: &mut W) -> Result<()> {
20+
impl ToSql for json::Json {
21+
fn to_sql<W: Writer+?Sized>(&self, ty: &Type, out: &mut W) -> Result<IsNull> {
2222
if let Type::Jsonb = *ty {
23-
try!(raw.write_u8(1));
23+
try!(out.write_u8(1));
2424
}
2525

26-
Ok(try!(write!(raw, "{}", self)))
26+
try!(write!(out, "{}", self));
27+
28+
Ok(IsNull::No)
2729
}
28-
}
2930

30-
to_raw_to_impl!(Type::Json, Type::Jsonb; json::Json);
31+
accepts!(Type::Json, Type::Jsonb);
32+
to_sql_checked!();
33+
}

0 commit comments

Comments
 (0)