@@ -8,6 +8,109 @@ use std::marker;
88
99use { Oid , FromUsize , IsNull , write_nullable} ;
1010
11+ pub enum Message < ' a > {
12+ Bind {
13+ portal : & ' a str ,
14+ statement : & ' a str ,
15+ formats : & ' a [ i16 ] ,
16+ values : & ' a [ Option < Vec < u8 > > ] ,
17+ result_formats : & ' a [ i16 ] ,
18+ } ,
19+ CancelRequest {
20+ process_id : i32 ,
21+ secret_key : i32 ,
22+ } ,
23+ Close {
24+ variant : u8 ,
25+ name : & ' a str ,
26+ } ,
27+ CopyData {
28+ data : & ' a [ u8 ] ,
29+ } ,
30+ CopyDone ,
31+ CopyFail {
32+ message : & ' a str ,
33+ } ,
34+ Describe {
35+ variant : u8 ,
36+ name : & ' a str ,
37+ } ,
38+ Execute {
39+ portal : & ' a str ,
40+ max_rows : i32 ,
41+ } ,
42+ Parse {
43+ name : & ' a str ,
44+ query : & ' a str ,
45+ param_types : & ' a [ Oid ] ,
46+ } ,
47+ PasswordMessage {
48+ password : & ' a str ,
49+ } ,
50+ Query {
51+ query : & ' a str ,
52+ } ,
53+ SslRequest ,
54+ StartupMessage {
55+ parameters : & ' a [ ( String , String ) ] ,
56+ } ,
57+ Sync ,
58+ Terminate ,
59+ #[ doc( hidden) ]
60+ __ForExtensibility,
61+ }
62+
63+ impl < ' a > Message < ' a > {
64+ #[ inline]
65+ pub fn serialize ( & self , buf : & mut Vec < u8 > ) -> io:: Result < ( ) > {
66+ match * self {
67+ Message :: Bind { portal, statement, formats, values, result_formats } => {
68+ let r = bind ( portal,
69+ statement,
70+ formats. iter ( ) . cloned ( ) ,
71+ values,
72+ |v, buf| {
73+ match * v {
74+ Some ( ref v) => {
75+ buf. extend_from_slice ( v) ;
76+ Ok ( IsNull :: No )
77+ }
78+ None => Ok ( IsNull :: Yes ) ,
79+ }
80+ } ,
81+ result_formats. iter ( ) . cloned ( ) ,
82+ buf) ;
83+ match r {
84+ Ok ( ( ) ) => Ok ( ( ) ) ,
85+ Err ( BindError :: Conversion ( _) ) => unreachable ! ( ) ,
86+ Err ( BindError :: Serialization ( e) ) => Err ( e) ,
87+ }
88+ }
89+ Message :: CancelRequest { process_id, secret_key } => {
90+ Ok ( cancel_request ( process_id, secret_key, buf) )
91+ }
92+ Message :: Close { variant, name } => close ( variant, name, buf) ,
93+ Message :: CopyData { data } => copy_data ( data, buf) ,
94+ Message :: CopyDone => Ok ( copy_done ( buf) ) ,
95+ Message :: CopyFail { message } => copy_fail ( message, buf) ,
96+ Message :: Describe { variant, name } => describe ( variant, name, buf) ,
97+ Message :: Execute { portal, max_rows } => execute ( portal, max_rows, buf) ,
98+ Message :: Parse { name, query, param_types } => {
99+ parse ( name, query, param_types. iter ( ) . cloned ( ) , buf)
100+ }
101+ Message :: PasswordMessage { password } => password_message ( password, buf) ,
102+ Message :: Query { query : q } => query ( q, buf) ,
103+ Message :: SslRequest => Ok ( ssl_request ( buf) ) ,
104+ Message :: StartupMessage { parameters } => {
105+ startup_message ( parameters. iter ( ) . map ( |& ( ref k, ref v) | ( & * * k, & * * v) ) , buf)
106+ }
107+ Message :: Sync => Ok ( sync ( buf) ) ,
108+ Message :: Terminate => Ok ( terminate ( buf) ) ,
109+ Message :: __ForExtensibility => unreachable ! ( ) ,
110+ }
111+ }
112+ }
113+
11114#[ inline]
12115fn write_body < F , E > ( buf : & mut Vec < u8 > , f : F ) -> Result < ( ) , E >
13116 where F : FnOnce ( & mut Vec < u8 > ) -> Result < ( ) , E > ,
0 commit comments