From 61b4ff6e6fb027f2071615eaeb83d44eeea1548d Mon Sep 17 00:00:00 2001 From: Federico Di Gregorio Date: Sat, 20 Nov 2004 10:57:54 +0000 Subject: [PATCH] First fixed to the async core. --- ChangeLog | 10 ++++++++++ psycopg/cursor_type.c | 20 +++++++++++++++----- sandbox/test.py | 28 +++++++++++++++++++++++----- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8f75da70..5f4357a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2004-11-20 Federico Di Gregorio + + * psycopg/cursor_type.c (_mogrify): ported %% fix from 1.1.15. + +2004-11-20 Federico Di Gregorio + + * psycopg/cursor_type.c (psyco_curs_execute): added check to raise an + exception if a cursor tries to .execute() while an async query is + already in execution froma different cursor. + 2004-11-20 Federico Di Gregorio * psycopg/connection_type.c (psyco_conn_cursor): renamed 'cursor' diff --git a/psycopg/cursor_type.c b/psycopg/cursor_type.c index 9cfa320d..5482f662 100644 --- a/psycopg/cursor_type.c +++ b/psycopg/cursor_type.c @@ -1,6 +1,6 @@ /* cursor_type.c - python interface to cursor objects * - * Copyright (C) 2003 Federico Di Gregorio + * Copyright (C) 2003-2004 Federico Di Gregorio * * This file is part of psycopg. * @@ -66,7 +66,7 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new) { PyObject *key, *value, *n, *item; char *d, *c; - int index = 0; + int index = 0, force = 0; /* from now on we'll use n and replace its value in *new only at the end, just before returning. we also init *new to NULL to exit with an error @@ -77,7 +77,7 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new) while(*c) { /* handle plain percent symbol in format string */ if (c[0] == '%' && c[1] == '%') { - c+=2; + c+=2; force = 1; } /* if we find '%(' then this is a dictionary, we: @@ -224,8 +224,11 @@ _mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new) } } + if (force && n == NULL) + n = PyTuple_New(0); *new = n; - return 0; + + return 0;; } #define psyco_curs_execute_doc \ @@ -246,6 +249,13 @@ psyco_curs_execute(cursorObject *self, PyObject *args, PyObject *kwargs) return NULL; } + if (self->conn->async_cursor != NULL + && self->conn->async_cursor != (PyObject*)self) { + PyErr_SetString(ProgrammingError, + "asynchronous query already in execution"); + return NULL; + } + if (PyUnicode_Check(operation)) { PyObject *enc = PyDict_GetItemString(psycoEncodings, self->conn->encoding); @@ -970,7 +980,7 @@ cursor_next(PyObject *self) { PyObject *res; - /* we don't parse argumente: psyco_curs_fetchone will do that for us */ + /* we don't parse arguments: psyco_curs_fetchone will do that for us */ res = psyco_curs_fetchone((cursorObject*)self, NULL); /* convert a None to NULL to signal the end of iteration */ diff --git a/sandbox/test.py b/sandbox/test.py index 5704f730..def672e2 100644 --- a/sandbox/test.py +++ b/sandbox/test.py @@ -1,12 +1,30 @@ import datetime +import time import psycopg #d = datetime.timedelta(12, 100, 9876) #print d.days, d.seconds, d.microseconds #print psycopg.adapt(d).getquoted() -o = psycopg.connect("dbname=test") -c = o.cursor() -c.execute("SELECT 1.0 AS foo") -print c.fetchmany(2) -print c.fetchall() +conn = psycopg.connect("dbname=test") +curs = conn.cursor() +#curs.execute("SELECT 1.0 AS foo") +#print curs.fetchmany(2) +#print curs.fetchall() + +def sleep(curs): + while not curs.isready(): + print "." + time.sleep(.1) + +#curs.execute(""" +# DECLARE zz INSENSITIVE SCROLL CURSOR WITH HOLD FOR +# SELECT now(); +# FOR READ ONLY;""", async = 1) +curs.execute("SELECT now() AS foo", async=1); +sleep(curs) + +#curs.execute(""" +# FETCH FORWARD 1 FROM zz;""", async = 1) +curs.execute("SELECT now() AS bar", async=1); +sleep(curs)