From 20adbaf36b34705f01c5020e5c83b2becbf18422 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 12 Oct 2019 18:01:27 -0700 Subject: [PATCH] Fix build for real --- postgres-types/src/serde_json_1.rs | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/postgres-types/src/serde_json_1.rs b/postgres-types/src/serde_json_1.rs index c6c35b00..7b8cfe8f 100644 --- a/postgres-types/src/serde_json_1.rs +++ b/postgres-types/src/serde_json_1.rs @@ -1,4 +1,4 @@ -use bytes::BytesMut; +use bytes::{BufMut, BytesMut}; use serde_1::{Deserialize, Serialize}; use serde_json_1::Value; use std::error::Error; @@ -7,6 +7,30 @@ use std::io::Read; use crate::{FromSql, IsNull, ToSql, Type}; +// https://github.com/tokio-rs/bytes/issues/170 +struct B<'a>(&'a mut BytesMut); + +impl<'a> BufMut for B<'a> { + #[inline] + fn remaining_mut(&self) -> usize { + usize::max_value() - self.0.len() + } + + #[inline] + unsafe fn advance_mut(&mut self, cnt: usize) { + self.0.advance_mut(cnt); + } + + #[inline] + unsafe fn bytes_mut(&mut self) -> &mut [u8] { + if !self.0.has_remaining_mut() { + self.0.reserve(64); + } + + self.0.bytes_mut() + } +} + /// A wrapper type to allow arbitrary `Serialize`/`Deserialize` types to convert to Postgres JSON values. #[derive(Debug)] pub struct Json(pub T); @@ -42,9 +66,9 @@ where out: &mut BytesMut, ) -> Result> { if *ty == Type::JSONB { - out.push(1); + B(out).put_u8(1); } - serde_json_1::ser::to_writer(out, &self.0)?; + serde_json_1::ser::to_writer(B(out).writer(), &self.0)?; Ok(IsNull::No) }