@@ -7,6 +7,7 @@ use super::prelude::*;
77use super :: Error ;
88use super :: FromDataType ;
99use super :: Vector ;
10+ use bytes:: BytesMut ;
1011
1112use std:: fmt:: Debug ;
1213use std:: str:: from_utf8;
@@ -34,7 +35,7 @@ pub struct Parameter {
3435 /// Parameter data length.
3536 pub len : i32 ,
3637 /// Parameter data.
37- pub data : Vec < u8 > ,
38+ pub data : Bytes ,
3839}
3940
4041impl Debug for Parameter {
@@ -59,14 +60,14 @@ impl Parameter {
5960 pub fn new_null ( ) -> Self {
6061 Self {
6162 len : -1 ,
62- data : vec ! [ ] ,
63+ data : Bytes :: new ( ) ,
6364 }
6465 }
6566
6667 pub fn new ( data : & [ u8 ] ) -> Self {
6768 Self {
6869 len : data. len ( ) as i32 ,
69- data : data . to_vec ( ) ,
70+ data : Bytes :: copy_from_slice ( data ) ,
7071 }
7172 }
7273}
@@ -124,8 +125,8 @@ pub struct Bind {
124125 codes : Vec < Format > ,
125126 /// Parameters.
126127 params : Vec < Parameter > ,
127- /// Results format.
128- results : Vec < i16 > ,
128+ /// Results format (raw bytes, 2 bytes per i16) .
129+ results : Bytes ,
129130 /// Original payload.
130131 original : Option < Bytes > ,
131132}
@@ -137,7 +138,7 @@ impl Default for Bind {
137138 statement : Bytes :: from ( "\0 " ) ,
138139 codes : vec ! [ ] ,
139140 params : vec ! [ ] ,
140- results : vec ! [ ] ,
141+ results : Bytes :: new ( ) ,
141142 original : None ,
142143 }
143144 }
@@ -149,7 +150,7 @@ impl Bind {
149150 + self . statement . len ( )
150151 + self . codes . len ( ) * std:: mem:: size_of :: < i16 > ( ) + 2 // num codes
151152 + self . params . iter ( ) . map ( |p| p. len ( ) ) . sum :: < usize > ( ) + 2 // num params
152- + self . results . len ( ) * std :: mem :: size_of :: < i16 > ( ) + 2 // num results
153+ + self . results . len ( ) + 2 // num results (results already stores raw bytes)
153154 + 4 // len
154155 + 1 // code
155156 }
@@ -237,7 +238,11 @@ impl Bind {
237238 results : & [ i16 ] ,
238239 ) -> Self {
239240 let mut me = Self :: new_params_codes ( name, params, codes) ;
240- me. results = results. to_vec ( ) ;
241+ let mut buf = BytesMut :: with_capacity ( results. len ( ) * 2 ) ;
242+ for result in results {
243+ buf. put_i16 ( * result) ;
244+ }
245+ me. results = buf. freeze ( ) ;
241246
242247 me
243248 }
@@ -274,17 +279,19 @@ impl FromBytes for Bind {
274279 . map ( |_| {
275280 let len = bytes. get_i32 ( ) ;
276281 let data = if len >= 0 {
277- let mut data = Vec :: with_capacity ( len as usize ) ;
278- ( 0 ..len) . for_each ( |_| data. push ( bytes. get_u8 ( ) ) ) ;
279- data
282+ bytes. split_to ( len as usize )
280283 } else {
281- vec ! [ ]
284+ Bytes :: new ( )
282285 } ;
283286 Parameter { len, data }
284287 } )
285288 . collect ( ) ;
286289 let num_results = bytes. get_i16 ( ) ;
287- let results = ( 0 ..num_results) . map ( |_| bytes. get_i16 ( ) ) . collect ( ) ;
290+ let results = if num_results > 0 {
291+ bytes. split_to ( ( num_results * 2 ) as usize )
292+ } else {
293+ Bytes :: new ( )
294+ } ;
288295
289296 Ok ( Self {
290297 portal,
@@ -321,10 +328,8 @@ impl ToBytes for Bind {
321328 payload. put_i32 ( param. len ) ;
322329 payload. put ( & param. data [ ..] ) ;
323330 }
324- payload. put_i16 ( self . results . len ( ) as i16 ) ;
325- for result in & self . results {
326- payload. put_i16 ( * result) ;
327- }
331+ payload. put_i16 ( ( self . results . len ( ) / 2 ) as i16 ) ;
332+ payload. put ( self . results . clone ( ) ) ;
328333 Ok ( payload. freeze ( ) )
329334 }
330335}
@@ -358,14 +363,18 @@ mod test {
358363 params : vec ! [
359364 Parameter {
360365 len: 2 ,
361- data: vec! [ 0 , 1 ] ,
366+ data: Bytes :: copy_from_slice ( & [ 0 , 1 ] ) ,
362367 } ,
363368 Parameter {
364369 len: 4 ,
365- data: "test" . as_bytes ( ) . to_vec ( ) ,
370+ data: Bytes :: from ( "test" ) ,
366371 } ,
367372 ] ,
368- results : vec ! [ 0 ] ,
373+ results : {
374+ let mut buf = BytesMut :: with_capacity ( 2 ) ;
375+ buf. put_i16 ( 0 ) ;
376+ buf. freeze ( )
377+ } ,
369378 } ;
370379 let bytes = bind. to_bytes ( ) . unwrap ( ) ;
371380 let mut original = Bind :: from_bytes ( bytes. clone ( ) ) . unwrap ( ) ;
@@ -400,7 +409,7 @@ mod test {
400409 statement : "test\0 " . into ( ) ,
401410 codes : vec ! [ Format :: Binary ] ,
402411 params : vec ! [ Parameter {
403- data: jsonb. as_bytes( ) . to_vec ( ) ,
412+ data: Bytes :: copy_from_slice ( jsonb. as_bytes( ) ) ,
404413 len: jsonb. len( ) as i32 ,
405414 } ] ,
406415 ..Default :: default ( )
0 commit comments