summaryrefslogtreecommitdiff
path: root/psycopg/microprotocols.c
diff options
context:
space:
mode:
Diffstat (limited to 'psycopg/microprotocols.c')
-rw-r--r--psycopg/microprotocols.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/psycopg/microprotocols.c b/psycopg/microprotocols.c
index c8cd5fe..42435b7 100644
--- a/psycopg/microprotocols.c
+++ b/psycopg/microprotocols.c
@@ -188,31 +188,42 @@ PyObject *
microprotocol_getquoted(PyObject *obj, connectionObject *conn)
{
PyObject *res = NULL;
- PyObject *tmp = microprotocols_adapt(
- obj, (PyObject*)&isqlquoteType, NULL);
-
- if (tmp != NULL) {
- Dprintf("microprotocol_getquoted: adapted to %s",
- tmp->ob_type->tp_name);
-
- /* if requested prepare the object passing it the connection */
- if (PyObject_HasAttrString(tmp, "prepare") && conn) {
- res = PyObject_CallMethod(tmp, "prepare", "O", (PyObject*)conn);
- if (res == NULL) {
- Py_DECREF(tmp);
- return NULL;
- }
- else {
+ PyObject *prepare = NULL;
+ PyObject *adapted;
+
+ if (!(adapted = microprotocols_adapt(obj, (PyObject*)&isqlquoteType, NULL))) {
+ goto exit;
+ }
+
+ Dprintf("microprotocol_getquoted: adapted to %s",
+ adapted->ob_type->tp_name);
+
+ /* if requested prepare the object passing it the connection */
+ if (conn) {
+ if ((prepare = PyObject_GetAttrString(adapted, "prepare"))) {
+ res = PyObject_CallFunctionObjArgs(
+ prepare, (PyObject *)conn, NULL);
+ if (res) {
Py_DECREF(res);
+ res = NULL;
+ } else {
+ goto exit;
}
}
-
- /* call the getquoted method on tmp (that should exist because we
- adapted to the right protocol) */
- res = PyObject_CallMethod(tmp, "getquoted", NULL);
- Py_DECREF(tmp);
+ else {
+ /* adapted.prepare not found */
+ PyErr_Clear();
+ }
}
+ /* call the getquoted method on adapted (that should exist because we
+ adapted to the right protocol) */
+ res = PyObject_CallMethod(adapted, "getquoted", NULL);
+
+exit:
+ Py_XDECREF(adapted);
+ Py_XDECREF(prepare);
+
/* we return res with one extra reference, the caller shall free it */
return res;
}