mirror of
https://github.com/psycopg/psycopg2.git
synced 2024-11-22 17:06:33 +03:00
parent
d3c1ad5945
commit
7ce7fef322
1
NEWS
1
NEWS
|
@ -21,6 +21,7 @@ What's new in psycopg 2.5.5
|
||||||
|
|
||||||
- Named cursors used as context manager don't swallow the exception on exit
|
- Named cursors used as context manager don't swallow the exception on exit
|
||||||
(:ticket:`#262`).
|
(:ticket:`#262`).
|
||||||
|
- Propagate read error messages in COPY FROM (:ticket:`#270`).
|
||||||
- PostgreSQL time 24:00 is converted to Python 00:00 (:ticket:`#278`).
|
- PostgreSQL time 24:00 is converted to Python 00:00 (:ticket:`#278`).
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1370,9 +1370,27 @@ _pq_copy_in_v3(cursorObject *curs)
|
||||||
res = PQputCopyEnd(curs->conn->pgconn, NULL);
|
res = PQputCopyEnd(curs->conn->pgconn, NULL);
|
||||||
else if (error == 2)
|
else if (error == 2)
|
||||||
res = PQputCopyEnd(curs->conn->pgconn, "error in PQputCopyData() call");
|
res = PQputCopyEnd(curs->conn->pgconn, "error in PQputCopyData() call");
|
||||||
else
|
else {
|
||||||
/* XXX would be nice to propagate the exception */
|
char buf[1024];
|
||||||
res = PQputCopyEnd(curs->conn->pgconn, "error in .read() call");
|
strcpy(buf, "error in .read() call");
|
||||||
|
if (PyErr_Occurred()) {
|
||||||
|
PyObject *t, *ex, *tb;
|
||||||
|
PyErr_Fetch(&t, &ex, &tb);
|
||||||
|
if (ex) {
|
||||||
|
PyObject *str;
|
||||||
|
str = PyObject_Str(ex);
|
||||||
|
str = psycopg_ensure_bytes(str);
|
||||||
|
if (str) {
|
||||||
|
PyOS_snprintf(buf, sizeof(buf),
|
||||||
|
"error in .read() call: %s %s",
|
||||||
|
((PyTypeObject *)t)->tp_name, Bytes_AsString(str));
|
||||||
|
Py_DECREF(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PyErr_Restore(t, ex, tb);
|
||||||
|
}
|
||||||
|
res = PQputCopyEnd(curs->conn->pgconn, buf);
|
||||||
|
}
|
||||||
|
|
||||||
CLEARPGRES(curs->pgres);
|
CLEARPGRES(curs->pgres);
|
||||||
|
|
||||||
|
|
|
@ -340,6 +340,34 @@ conn.close()
|
||||||
proc.communicate()
|
proc.communicate()
|
||||||
self.assertEqual(0, proc.returncode)
|
self.assertEqual(0, proc.returncode)
|
||||||
|
|
||||||
|
def test_copy_from_propagate_error(self):
|
||||||
|
class BrokenRead(_base):
|
||||||
|
def read(self, size):
|
||||||
|
return 1/0
|
||||||
|
|
||||||
|
def readline(self):
|
||||||
|
return 1/0
|
||||||
|
|
||||||
|
curs = self.conn.cursor()
|
||||||
|
# It seems we cannot do this, but now at least we propagate the error
|
||||||
|
# self.assertRaises(ZeroDivisionError,
|
||||||
|
# curs.copy_from, BrokenRead(), "tcopy")
|
||||||
|
try:
|
||||||
|
curs.copy_from(BrokenRead(), "tcopy")
|
||||||
|
except Exception, e:
|
||||||
|
self.assert_('ZeroDivisionError' in str(e))
|
||||||
|
|
||||||
|
def test_copy_to_propagate_error(self):
|
||||||
|
class BrokenWrite(_base):
|
||||||
|
def write(self, data):
|
||||||
|
return 1/0
|
||||||
|
|
||||||
|
curs = self.conn.cursor()
|
||||||
|
curs.execute("insert into tcopy values (10, 'hi')")
|
||||||
|
self.assertRaises(ZeroDivisionError,
|
||||||
|
curs.copy_to, BrokenWrite(), "tcopy")
|
||||||
|
|
||||||
|
|
||||||
decorate_all_tests(CopyTests, skip_copy_if_green)
|
decorate_all_tests(CopyTests, skip_copy_if_green)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user