Skip to content

Commit 9a9651c

Browse files
committed
Merge branch 'master' into auth
2 parents e614b26 + eed337c commit 9a9651c

File tree

3 files changed

+67
-14
lines changed

3 files changed

+67
-14
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "msql-srv"
3-
version = "0.9.5"
3+
version = "0.9.6"
44
edition = "2018"
55

66
description = "Bindings for emulating a MySQL/MariaDB server"

src/resultset.rs

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -347,27 +347,31 @@ where
347347
}
348348

349349
impl<'a, W: Write + 'a> RowWriter<'a, W> {
350-
fn finish_inner(&mut self) -> io::Result<()> {
350+
fn finish_inner(&mut self, complete: bool) -> io::Result<()> {
351351
if self.finished {
352352
return Ok(());
353353
}
354+
354355
self.finished = true;
355356

356357
if !self.columns.is_empty() && self.col != 0 {
357358
self.end_row()?;
358359
}
359360

360-
if self.columns.is_empty() {
361-
// response to no column query is always an OK packet
362-
// we've kept track of the number of rows in col (hacky, I know)
363-
self.result.as_mut().unwrap().last_end = Some(Finalizer::Ok {
364-
rows: self.col as u64,
365-
last_insert_id: 0,
366-
});
367-
} else {
368-
// we wrote out at least one row
369-
self.result.as_mut().unwrap().last_end = Some(Finalizer::Eof);
361+
if complete {
362+
if self.columns.is_empty() {
363+
// response to no column query is always an OK packet
364+
// we've kept track of the number of rows in col (hacky, I know)
365+
self.result.as_mut().unwrap().last_end = Some(Finalizer::Ok {
366+
rows: self.col as u64,
367+
last_insert_id: 0,
368+
});
369+
} else {
370+
// we wrote out at least one row
371+
self.result.as_mut().unwrap().last_end = Some(Finalizer::Eof);
372+
}
370373
}
374+
371375
Ok(())
372376
}
373377

@@ -378,15 +382,26 @@ impl<'a, W: Write + 'a> RowWriter<'a, W> {
378382

379383
/// End this resultset response, and indicate to the client that no more rows are coming.
380384
pub fn finish_one(mut self) -> io::Result<QueryResultWriter<'a, W>> {
381-
self.finish_inner()?;
385+
self.finish_inner(true)?;
386+
382387
// we know that dropping self will see self.finished == true,
383388
// and so Drop won't try to use self.result.
384389
Ok(self.result.take().unwrap())
385390
}
391+
392+
/// End this resultset response, and indicate to the client there was an error.
393+
pub fn finish_error<E>(mut self, kind: ErrorKind, msg: &E) -> io::Result<()>
394+
where
395+
E: Borrow<[u8]>,
396+
{
397+
self.finish_inner(false)?;
398+
399+
self.result.take().unwrap().error(kind, msg)
400+
}
386401
}
387402

388403
impl<'a, W: Write + 'a> Drop for RowWriter<'a, W> {
389404
fn drop(&mut self) {
390-
self.finish_inner().unwrap();
405+
self.finish_inner(true).unwrap();
391406
}
392407
}

tests/main.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,44 @@ fn error_response() {
269269
})
270270
}
271271

272+
#[test]
273+
fn error_in_result_set_response() {
274+
let err = (ErrorKind::ER_NO, "clearly not");
275+
TestingShim::new(
276+
move |_, w| {
277+
let cols = &[Column {
278+
table: String::new(),
279+
column: "a".to_owned(),
280+
coltype: myc::constants::ColumnType::MYSQL_TYPE_SHORT,
281+
colflags: myc::constants::ColumnFlags::empty(),
282+
}];
283+
let mut w = w.start(cols)?;
284+
w.write_col(1024)?;
285+
w.finish_error(err.0, &err.1.as_bytes())
286+
},
287+
|_| unreachable!(),
288+
|_, _, _| unreachable!(),
289+
|_, _| unreachable!(),
290+
)
291+
.test(|db| {
292+
let mut result = db.query_iter("SELECT a FROM foo").unwrap();
293+
let row1 = result.next().unwrap().unwrap().get::<i16, _>(0).unwrap();
294+
assert_eq!(row1, 1024);
295+
if let mysql::Error::MySqlError(e) = result.by_ref().next().unwrap().unwrap_err() {
296+
assert_eq!(
297+
e,
298+
mysql::error::MySqlError {
299+
state: String::from_utf8(err.0.sqlstate().to_vec()).unwrap(),
300+
message: err.1.to_owned(),
301+
code: err.0 as u16,
302+
}
303+
);
304+
} else {
305+
unreachable!()
306+
}
307+
})
308+
}
309+
272310
#[test]
273311
fn empty_on_drop() {
274312
let cols = [Column {

0 commit comments

Comments
 (0)