I've tried to close the cursor and even the connection while the execute
statement is running but it always waits for the cursor.execute() statement
to return before raising an exception.
Is there a way of aborting the execution of an SQL statement ?

I've just checked in a patch that allows calling cancel() on a pg connection. The example below shows that it works.

Currently you can only use it with the classic pg interface. There is no such functionality in the DBAPI. If you really want to do it, it is possible to get the connection object from a pgdb connection and call the cancel method(). However, the connection object is a private attribute and is not easy to access (purposfully so).

This raises the question whether the __ctx and __source attributes of pgdb connections should be renamed to _ctx and _source to make them accessible if you want to do such things that are not in the DBAPI.
Opinions?

-- Christoph

----------- testing the cancel() method ---------

import threading, time
import pg

db = pg.DB('test')

class LongQuery(threading.Thread):

    def run(self):
        global db
        print "Subthread starts..."
        print "Creating test table..."
        try:
            db.query("drop table t")
        except pg.ProgrammingError:
            pass
        db.query("create table t as"
            " (select 0 union select 1 union select 2"
            " union select 3 union select 4 union select 5"
            " union select 6 union select 7 union select 8"
            " union select 9 union select 10)")
        print "Starting long query..."
        try:
            db.query("select sum(sin(0.2)+cos(0.3)+tan(0.4))"
                " from t cross join t as t1 cross join t as t2"
                " cross join t as t3 cross join t as t4"
                " cross join t as t5 cross join t as t6"
                " cross join t as t7 cross join t as t8"
                " cross join t as t9 cross join t as t10")
        except pg.ProgrammingError, e:
            print "Query has been cancelled."
            print str(e).strip()
        else:
            print "Long query finished."
        print "Subthread ends..."

LongQuery().start()
time.sleep(3)
print "3 seconds over..."
time.sleep(3)
print "another 3 seconds over, aborting query..."
db.cancel()
print "cancelled query."

_______________________________________________
PyGreSQL mailing list
[email protected]
http://mailman.vex.net/mailman/listinfo/pygresql

Reply via email to