Skip to content

Commit dd40522

Browse files
committed
Improve error handling in COPY
1 parent 51ace90 commit dd40522

2 files changed

Lines changed: 21 additions & 10 deletions

File tree

src/lib.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1644,7 +1644,7 @@ impl<'a> PostgresCopyInStatement<'a> {
16441644
let _ = buf.write_be_i32(0);
16451645
let _ = buf.write_be_i32(0);
16461646

1647-
for mut row in rows {
1647+
'l: for mut row in rows {
16481648
let _ = buf.write_be_i16(self.column_types.len() as i16);
16491649

16501650
let mut types = self.column_types.iter();
@@ -1662,31 +1662,30 @@ impl<'a> PostgresCopyInStatement<'a> {
16621662
}
16631663
}
16641664
(Some(_), None) | (None, Some(_)) => {
1665-
try_pg!(conn.stream.write_message(
1665+
try_pg_desync!(conn, conn.stream.write_message(
16661666
&CopyFail {
16671667
message: "Invalid column count",
16681668
}));
1669-
break;
1669+
break 'l;
16701670
}
16711671
(None, None) => break
16721672
}
16731673
}
16741674

1675-
try_pg!(conn.stream.write_message(
1675+
try_pg_desync!(conn, conn.stream.write_message(
16761676
&CopyData {
16771677
data: buf.unwrap().as_slice()
16781678
}));
16791679
buf = MemWriter::new();
16801680
}
16811681

16821682
let _ = buf.write_be_i16(-1);
1683-
try_pg!(conn.stream.write_message(
1684-
&CopyData {
1683+
try_pg!(conn.write_messages([
1684+
CopyData {
16851685
data: buf.unwrap().as_slice(),
1686-
}));
1687-
try_pg!(conn.stream.write_message(&CopyDone));
1688-
try_pg!(conn.stream.write_message(&Sync));
1689-
try_pg!(conn.stream.flush());
1686+
},
1687+
CopyDone,
1688+
Sync]));
16901689

16911690
let num = match try_pg!(conn.read_message_()) {
16921691
CommandComplete { tag } => util::parse_update_count(tag),

src/macros.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ macro_rules! try_desync(
2828
)
2929
)
3030

31+
macro_rules! try_pg_desync(
32+
($s:expr, $e:expr) => (
33+
match $e {
34+
Ok(ok) => ok,
35+
Err(err) => {
36+
$s.desynchronized = true;
37+
return Err(PgStreamError(err))
38+
}
39+
}
40+
)
41+
)
42+
3143
macro_rules! check_desync(
3244
($e:expr) => ({
3345
if $e.canary() != CANARY {

0 commit comments

Comments
 (0)