summaryrefslogtreecommitdiff
path: root/paste/transaction.py
diff options
context:
space:
mode:
authorcce <devnull@localhost>2005-12-15 03:26:48 +0000
committercce <devnull@localhost>2005-12-15 03:26:48 +0000
commitce11428a56a4a57da6a3ba6a0d105e808d830188 (patch)
tree277b0464d33b743e7d70918012f155b326769a8c /paste/transaction.py
parent641927a86f3c92d2276aa49528e1d48d83491649 (diff)
downloadpaste-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.py18
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']