Skip to content

Commit 5299138

Browse files
committed
More protocol moves
1 parent 59e1273 commit 5299138

2 files changed

Lines changed: 44 additions & 113 deletions

File tree

src/lib.rs

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -435,16 +435,17 @@ impl InnerConnection {
435435
fn raw_prepare(&mut self, stmt_name: &str, query: &str) -> Result<(Vec<Type>, Vec<Column>)> {
436436
debug!("preparing query with name `{}`: {}", stmt_name, query);
437437

438-
try!(self.write_messages(&[Frontend::Parse {
439-
name: stmt_name,
440-
query: query,
441-
param_types: &[],
442-
},
443-
Frontend::Describe {
444-
variant: b'S',
445-
name: stmt_name,
446-
},
447-
Frontend::Sync]));
438+
try!(self.write_message(&frontend::Parse {
439+
name: stmt_name,
440+
query: query,
441+
param_types: &[],
442+
}));
443+
try!(self.write_message(&frontend::Describe {
444+
variant: b'S',
445+
name: stmt_name,
446+
}));
447+
try!(self.write_message(&frontend::Sync));
448+
try!(self.stream.flush());
448449

449450
match try!(self.read_message()) {
450451
Backend::ParseComplete => {}
@@ -499,11 +500,11 @@ impl InnerConnection {
499500
return DbError::new(fields);
500501
}
501502
Backend::CopyInResponse { .. } => {
502-
try!(self.write_messages(&[Frontend::CopyFail {
503-
message: "COPY queries cannot be directly \
504-
executed",
505-
},
506-
Frontend::Sync]));
503+
try!(self.write_message(&frontend::CopyFail {
504+
message: "COPY queries cannot be directly executed",
505+
}));
506+
try!(self.write_message(&frontend::Sync));
507+
try!(self.stream.flush());
507508
}
508509
Backend::CopyOutResponse { .. } => {
509510
loop {
@@ -548,18 +549,19 @@ impl InnerConnection {
548549
}
549550
}
550551

551-
try!(self.write_messages(&[Frontend::Bind {
552-
portal: portal_name,
553-
statement: &stmt_name,
554-
formats: &[1],
555-
values: &values,
556-
result_formats: &[1],
557-
},
558-
Frontend::Execute {
559-
portal: portal_name,
560-
max_rows: row_limit,
561-
},
562-
Frontend::Sync]));
552+
try!(self.write_message(&frontend::Bind {
553+
portal: portal_name,
554+
statement: &stmt_name,
555+
formats: &[1],
556+
values: &values,
557+
result_formats: &[1],
558+
}));
559+
try!(self.write_message(&frontend::Execute {
560+
portal: portal_name,
561+
max_rows: row_limit,
562+
}));
563+
try!(self.write_message(&frontend::Sync));
564+
try!(self.stream.flush());
563565

564566
match try!(self.read_message()) {
565567
Backend::BindComplete => Ok(()),
@@ -613,11 +615,12 @@ impl InnerConnection {
613615
}
614616

615617
fn close_statement(&mut self, name: &str, type_: u8) -> Result<()> {
616-
try!(self.write_messages(&[Frontend::Close {
617-
variant: type_,
618-
name: name,
619-
},
620-
Frontend::Sync]));
618+
try!(self.write_message(&frontend::Close {
619+
variant: type_,
620+
name: name,
621+
}));
622+
try!(self.write_message(&frontend::Sync));
623+
try!(self.stream.flush());
621624
let resp = match try!(self.read_message()) {
622625
Backend::CloseComplete => Ok(()),
623626
Backend::ErrorResponse { fields } => DbError::new(fields),
@@ -816,7 +819,8 @@ impl InnerConnection {
816819
fn quick_query(&mut self, query: &str) -> Result<Vec<Vec<Option<String>>>> {
817820
check_desync!(self);
818821
debug!("executing query: {}", query);
819-
try!(self.write_messages(&[Frontend::Query { query: query }]));
822+
try!(self.write_message(&frontend::Query { query: query }));
823+
try!(self.stream.flush());
820824

821825
let mut result = vec![];
822826
loop {
@@ -830,11 +834,11 @@ impl InnerConnection {
830834
.collect());
831835
}
832836
Backend::CopyInResponse { .. } => {
833-
try!(self.write_messages(&[Frontend::CopyFail {
834-
message: "COPY queries cannot be directly \
835-
executed",
836-
},
837-
Frontend::Sync]));
837+
try!(self.write_message(&frontend::CopyFail {
838+
message: "COPY queries cannot be directly executed",
839+
}));
840+
try!(self.write_message(&frontend::Sync));
841+
try!(self.stream.flush());
838842
}
839843
Backend::ErrorResponse { fields } => {
840844
try!(self.wait_for_ready());
@@ -848,7 +852,8 @@ impl InnerConnection {
848852

849853
fn finish_inner(&mut self) -> Result<()> {
850854
check_desync!(self);
851-
try!(self.write_messages(&[Frontend::Terminate]));
855+
try!(self.write_message(&frontend::Terminate));
856+
try!(self.stream.flush());
852857
Ok(())
853858
}
854859
}

src/message.rs

Lines changed: 0 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -85,50 +85,26 @@ pub struct RowDescriptionEntry {
8585
}
8686

8787
pub enum Frontend<'a> {
88-
Bind {
89-
portal: &'a str,
90-
statement: &'a str,
91-
formats: &'a [i16],
92-
values: &'a [Option<Vec<u8>>],
93-
result_formats: &'a [i16],
94-
},
9588
CancelRequest {
9689
code: u32,
9790
process_id: u32,
9891
secret_key: u32,
9992
},
100-
Close {
101-
variant: u8,
102-
name: &'a str,
103-
},
10493
CopyData {
10594
data: &'a [u8],
10695
},
10796
CopyDone,
10897
CopyFail {
10998
message: &'a str,
11099
},
111-
Describe {
112-
variant: u8,
113-
name: &'a str,
114-
},
115100
Execute {
116101
portal: &'a str,
117102
max_rows: i32,
118103
},
119-
Parse {
120-
name: &'a str,
121-
query: &'a str,
122-
param_types: &'a [Oid],
123-
},
124-
Query {
125-
query: &'a str,
126-
},
127104
SslRequest {
128105
code: u32,
129106
},
130107
Sync,
131-
Terminate,
132108
}
133109

134110
#[doc(hidden)]
@@ -155,42 +131,11 @@ impl<W: Write> WriteMessage for W {
155131
let mut ident = None;
156132

157133
match *message {
158-
Frontend::Bind { portal, statement, formats, values, result_formats } => {
159-
ident = Some(b'B');
160-
try!(buf.write_cstr(portal));
161-
try!(buf.write_cstr(statement));
162-
163-
try!(buf.write_u16::<BigEndian>(try!(u16::from_usize(formats.len()))));
164-
for &format in formats {
165-
try!(buf.write_i16::<BigEndian>(format));
166-
}
167-
168-
try!(buf.write_u16::<BigEndian>(try!(u16::from_usize(values.len()))));
169-
for value in values {
170-
match *value {
171-
None => try!(buf.write_i32::<BigEndian>(-1)),
172-
Some(ref value) => {
173-
try!(buf.write_i32::<BigEndian>(try!(i32::from_usize(value.len()))));
174-
try!(buf.write_all(&**value));
175-
}
176-
}
177-
}
178-
179-
try!(buf.write_u16::<BigEndian>(try!(u16::from_usize(result_formats.len()))));
180-
for &format in result_formats {
181-
try!(buf.write_i16::<BigEndian>(format));
182-
}
183-
}
184134
Frontend::CancelRequest { code, process_id, secret_key } => {
185135
try!(buf.write_u32::<BigEndian>(code));
186136
try!(buf.write_u32::<BigEndian>(process_id));
187137
try!(buf.write_u32::<BigEndian>(secret_key));
188138
}
189-
Frontend::Close { variant, name } => {
190-
ident = Some(b'C');
191-
try!(buf.write_u8(variant));
192-
try!(buf.write_cstr(name));
193-
}
194139
Frontend::CopyData { data } => {
195140
ident = Some(b'd');
196141
try!(buf.write_all(data));
@@ -200,32 +145,13 @@ impl<W: Write> WriteMessage for W {
200145
ident = Some(b'f');
201146
try!(buf.write_cstr(message));
202147
}
203-
Frontend::Describe { variant, name } => {
204-
ident = Some(b'D');
205-
try!(buf.write_u8(variant));
206-
try!(buf.write_cstr(name));
207-
}
208148
Frontend::Execute { portal, max_rows } => {
209149
ident = Some(b'E');
210150
try!(buf.write_cstr(portal));
211151
try!(buf.write_i32::<BigEndian>(max_rows));
212152
}
213-
Frontend::Parse { name, query, param_types } => {
214-
ident = Some(b'P');
215-
try!(buf.write_cstr(name));
216-
try!(buf.write_cstr(query));
217-
try!(buf.write_u16::<BigEndian>(try!(u16::from_usize(param_types.len()))));
218-
for &ty in param_types {
219-
try!(buf.write_u32::<BigEndian>(ty));
220-
}
221-
}
222-
Frontend::Query { query } => {
223-
ident = Some(b'Q');
224-
try!(buf.write_cstr(query));
225-
}
226153
Frontend::SslRequest { code } => try!(buf.write_u32::<BigEndian>(code)),
227154
Frontend::Sync => ident = Some(b'S'),
228-
Frontend::Terminate => ident = Some(b'X'),
229155
}
230156

231157
if let Some(ident) = ident {

0 commit comments

Comments
 (0)