diff options
author | cce <devnull@localhost> | 2005-12-15 03:26:48 +0000 |
---|---|---|
committer | cce <devnull@localhost> | 2005-12-15 03:26:48 +0000 |
commit | ce11428a56a4a57da6a3ba6a0d105e808d830188 (patch) | |
tree | 277b0464d33b743e7d70918012f155b326769a8c /paste/transaction.py | |
parent | 641927a86f3c92d2276aa49528e1d48d83491649 (diff) | |
download | paste-ce11428a56a4a57da6a3ba6a0d105e808d830188.tar.gz |
updated transaction.py to use catch_errors (so that it handles iterators and close() properly; this needs a bloody regression test
Diffstat (limited to 'paste/transaction.py')
-rw-r--r-- | paste/transaction.py | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/paste/transaction.py b/paste/transaction.py index e475a67..b7fbc4e 100644 --- a/paste/transaction.py +++ b/paste/transaction.py @@ -12,6 +12,7 @@ two-phase commit goodness that I don't need. This is experimental, and will change in the future. """ from paste.httpexceptions import HTTPError, HTTPException +from wsgilib import catch_errors class ConnectionFactory(object): """ @@ -46,12 +47,14 @@ def BasicTransactionHandler(application, factory): through a HTTPException's code. If it is a 100, 200, or 300; the transaction is committed; otherwise it is rolled back. """ - def basic_transaction(environ, start_response): conn = factory(environ) environ['paste.connection'] = conn should_commit = [500] - def finalizer(): + def finalizer(exc_info=None): + if exc_info: + if issubclass(exc_info[0], HTTPException): + should_commit.append(exc_info[1].code) if should_commit.pop() < 400: conn.commit() else: @@ -60,15 +63,8 @@ def BasicTransactionHandler(application, factory): def basictrans_start_response(status, headers, exc_info = None): should_commit.append(int(status.split(" ")[0])) return start_response(status, headers, exc_info) - try: - for chunk in application(environ, basictrans_start_response): - yield chunk - except Exception, e: - if isinstance(e,HTTPException): - should_commit.append(e.code) - finalizer() - raise - finalizer() + return catch_errors(application, environ, basictrans_start_response, + finalizer, finalizer) return basic_transaction __all__ = ['ConnectionFactory','BasicTransactionHandler'] |