Package: python-turbogears
Version: 1.0-1
Severity: important
After executing a controller method to handle a page request, TurboGears
is supposed to commit any changes that the controller made to the
database. When using SQLAlchemy, it fails to do this. It's possible to
work around this by modifying the controller to do the commit manually,
but that's not something that the application should be doing. I'm
calling this bug "important" because existing TurboGears-based web
applications, as-written, will not work correctly on this release of
TurboGears if they use SQLAlchemy.
TurboGears' database support (for both SQLObject and SQLAlchemy) is
implemented in the file "turbogears/database.py". This file contains a
generic "run_with_transaction" function:
[dispatch.generic(MultiorderGenericFunction)]
def run_with_transaction(func, *args, **kw):
pass
which is supposed to call either so_rwt() or sa_rwt() depending on
whether SQLObject or SQLAlchemy is in use:
[run_with_transaction.when("not _use_sa()")]
def so_rwt(func, *args, **kw):
...
[run_with_transaction.when("_use_sa()")]
def sa_rwt(func, *args, **kw):
...
The check for whether SQLAlchemy is in use is done by looking at a
global variable:
def _use_sa():
return _engine is not None
The _engine variable is initialized to None near the top of this file,
and a function called get_engine() is provided which may assign an
object to it after reading some options from a config file.
The problem is that the so_rwt() and sa_rwt() functions get registered
with the run_with_transaction() dispatcher at the same time as they're
defined: while Python is executing turbogears/database.py in response
to an import declaration. At this point the get_engine() function has
been defined, but hasn't been run yet, so _engine is always going to be
None, and run_with_transaction() always ends up calling so_rwt(), never
sa_rwt().
How to reproduce this: use quickstart to create a new SQLAlchemy
project, and then run "tg-admin shell" on it. Do the following:
import turbogears.database
turbogears.database.run_with_transaction(None)
This will cause a TypeError exception, and you'll see so_rwt() in the
stack trace.
If I modify turbogears/database.py and put "print _use_sa()" just before
the definition of the so_rwt() function, I see False printed when I
start a shell, even though running turbogears.database._use_sa() from
within the shell yields True. That False is what causes so_rwt() to
become the function that the dispatcher uses, rather than sa_rwt() like
it should.
-- System Information:
Debian Release: 4.0
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1,
'experimental')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-3-686-bigmem
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Versions of packages python-turbogears depends on:
ii python 2.4.4-2 An interactive high-level object-o
ii python-celementtree 1.0.5-8 Light-weight toolkit for XML proce
ii python-cheetah 2.0~rc7-1 text-based template engine and Pyt
ii python-cherrypy 2.2.1-3 Python web development framework
ii python-configobj 4.3.2-2 a simple but powerful config file
ii python-dispatch 0.5adev-5 Rule-based Dispatching and Generic
ii python-elementtree 1.2.6-10 Light-weight toolkit for XML proce
ii python-formencode 0.6-1 validation and form generation pyt
ii python-kid 0.9.4-1 simple Pythonic template language
ii python-nose 0.9.0-2 test discovery and running for Pyt
ii python-paste 1.0.1-1 Tools for using a Web Server Gatew
ii python-pastedeploy 1.0-1 Load, configure, and compose WSGI
ii python-pastescript 1.0-1 serving web applications, creating
ii python-setuptools 0.6c5-2 Python Distutils Enhancements
ii python-simplejson 1.5-1 Simple, fast, extensible JSON enco
ii python-sqlalchemy 0.3.1-2 SQL toolkit and Object Relational
ii python-sqlobject 0.7.2-1 python module for SQLObject
ii python-support 0.5.6 automated rebuilding support for p
ii python-turbojson 0.9.5-1 TurboGears template plugin that su
ii python-turbokid 0.9.9-1 TurboGears template plugin that su
Versions of packages python-turbogears recommends:
ii python-pysqlite2 2.3.2-1 python interface to SQLite 3
-- no debconf information
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]