Opened 14 years ago

Last modified 10 years ago

#7504 closed defect

'Cannot operate on a closed cursor' eception causes db to appear as if upgrade is needed — at Initial Version

Reported by: Daniel Abel Owned by: Alec Thomas
Priority: normal Component: TagsPlugin
Severity: blocker Keywords: cursor, ProgrammingError, closed
Cc: Steffen Hoffmann Trac Release: 0.12

Description

Trying to configure an existing trac instance to work from under virtualenv (trac 0.12, with wsgi under apache), I ran into a situation where, after running 'trac-admin /path/to/env upgrade' and wiki upgrade, trac, when being called by the webserver says that I have to run the upgrade. (ie. shows an error page to this effect) Running upgrade again on the command line says "no upgrade necessary", i.e. running trac from command-line and having it called from the webserver (via wsgi) gives two different results to the "need to be upgraded?" question.

I managed to track this down to the fact that TagModelProvider's environment_needs_upgrade return 'True' when being called from wsgi, and False when being called from the console. The problem appears to be that the cursor.execute('select count(*) from tags' ) line in there throws an exception, but not because the db is old, but because 'Cannot operate on a closed cursor'.

(I am using sqlite)

Moving the 'cursor = db.cursor()' line to below the 'if self._need_migration(db)', ie. to just above the try/except appears to solve this issue.

So, suggestions: 1) the 'except:' line in environment_needs_upgrade() shouldn't be so greedy, i.e. it shouldn't swallow all exceptions (if possible to filter out those caused by an old database)

2) the 'cursor=db.cursor()' line should be moved to just above where it is first used.

Note that I assume the situation I ran into would be very difficult to reproduce, but the suggestions above won't have any drawbacks, and just help make the code cleaner.

Change History (0)

Note: See TracTickets for help on using tickets.