Skip to content

Commit 2743b65

Browse files
committed
buffer optimizations
1 parent ea0b62b commit 2743b65

File tree

3 files changed

+24
-44
lines changed

3 files changed

+24
-44
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/proxy.rs

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -70,35 +70,8 @@ struct DemoHandler {}
7070
impl PacketHandler for DemoHandler {
7171

7272
fn handle_request(&self, p: &Packet) -> Action {
73-
print_packet_chars(&p.bytes);
74-
match p.packet_type() {
75-
Ok(PacketType::ComQuery) => {
76-
77-
// ComQuery packets just contain a SQL string as the payload
78-
let slice = &p.bytes[5..];
79-
80-
// convert the slice to a String object
81-
let sql = String::from_utf8(slice.to_vec()).expect("Invalid UTF-8");
82-
83-
// log the query
84-
println!("SQL: {}", sql);
85-
86-
// dumb example of conditional proxy behavior
87-
if sql.contains("avocado") {
88-
// take over processing of this packet and return an error packet
89-
// to the client
90-
Action::Respond(vec![Packet::error_packet(
91-
1064, // error code
92-
[0x31,0x32,0x33,0x34,0x35], // sql state
93-
String::from("Proxy rejecting any avocado-related queries"))])
94-
} else {
95-
// pass the packet to MySQL unmodified
96-
Action::Forward
97-
}
98-
},
99-
// pass the packet to MySQL unmodified
100-
_ => Action::Forward
101-
}
73+
//
74+
Action::Forward
10275
}
10376

10477
fn handle_response(&self, _: &Packet) -> Action {

src/lib.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -193,15 +193,17 @@ impl ConnReader {
193193
let mut temp : Vec<u8> = Vec::with_capacity(s);
194194
temp.extend_from_slice(&self.read_buf[0..s]);
195195
let p = Packet { bytes: temp };
196-
197-
// shift data down
198-
let mut j = 0;
199-
for i in s .. self.read_pos {
200-
self.read_buf[j] = self.read_buf[i];
201-
j += 1;
196+
if self.read_pos == s {
197+
self.read_pos = 0;
198+
} else {
199+
// shift data down
200+
let mut j = 0;
201+
for i in s .. self.read_pos {
202+
self.read_buf[j] = self.read_buf[i];
203+
j += 1;
204+
}
205+
self.read_pos -= s;
202206
}
203-
self.read_pos -= s;
204-
205207
Some(p)
206208
} else {
207209
None
@@ -236,13 +238,18 @@ impl ConnWriter {
236238
match self.stream.poll_write() {
237239
Async::Ready(_) => {
238240
let s = try!((&*self.stream).write(&self.write_buf[0..self.write_pos]));
239-
240-
let mut j = 0;
241-
for i in s..self.write_pos {
242-
self.write_buf[j] = self.write_buf[i];
243-
j += 1;
241+
if s == self.write_pos {
242+
self.write_pos = 0;
243+
} else {
244+
// for a partial write, shift data down
245+
let mut j = 0;
246+
for i in s..self.write_pos {
247+
self.write_buf[j] = self.write_buf[i];
248+
j += 1;
249+
}
250+
self.write_pos -= s;
244251
}
245-
self.write_pos -= s;
252+
246253
},
247254
_ => return Ok(Async::NotReady)
248255
}

0 commit comments

Comments
 (0)