From 8a081143146ca68c4a40ba7daedf3e104a02819d Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sat, 19 Feb 2011 14:13:32 +0000 Subject: [PATCH] Correctly handle exceptions with non-ascii chars in the message Previous implementation would have barfed in canse of non-utf-8 data in the message. --- psycopg/psycopgmodule.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/psycopg/psycopgmodule.c b/psycopg/psycopgmodule.c index 82a6a2d1..a498223e 100644 --- a/psycopg/psycopgmodule.c +++ b/psycopg/psycopgmodule.c @@ -593,14 +593,27 @@ psyco_set_error(PyObject *exc, PyObject *curs, const char *msg, const char *pgerror, const char *pgcode) { PyObject *t; + PyObject *pymsg; + PyObject *err = NULL; + connectionObject *conn = NULL; - PyObject *err = PyObject_CallFunction(exc, "s", msg); + if (curs) { + conn = ((cursorObject *)curs)->conn; + } + + if ((pymsg = conn_text_from_chars(conn, msg))) { + err = PyObject_CallFunctionObjArgs(exc, pymsg, NULL); + Py_DECREF(pymsg); + } + else { + /* what's better than an error in an error handler in the morning? + * Anyway, some error was set, refcount is ok... get outta here. */ + return; + } if (err) { - connectionObject *conn = NULL; if (curs) { PyObject_SetAttrString(err, "cursor", curs); - conn = ((cursorObject *)curs)->conn; } if (pgerror) {