diff --git a/VERSION b/VERSION index d0fb5069..275efaa9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.08.09.15.15.41 +Version 2.6.0-development+timestamp.2013.08.09.15.56.36 diff --git a/gluon/main.py b/gluon/main.py index 9d879598..4dc3695d 100644 --- a/gluon/main.py +++ b/gluon/main.py @@ -514,11 +514,17 @@ def wsgibase(environ, responder): # on application error, rollback database # ################################################## - ticket = e.log(request) or 'unknown' + # log tickets before rollback if not in DB + if not request.tickets_db: + ticket = e.log(request) or 'unknown' + # rollback if response._custom_rollback: response._custom_rollback() else: BaseAdapter.close_all_instances('rollback') + # if tickets in db, reconnect and store it in db + if request.tickets_db: + ticket = e.log(request) or 'unknown' http_response = \ HTTP(500, rwthread.routes.error_message_ticket % diff --git a/gluon/restricted.py b/gluon/restricted.py index 34afcf5e..4d113a09 100644 --- a/gluon/restricted.py +++ b/gluon/restricted.py @@ -48,13 +48,19 @@ class TicketStorage(Storage): self._store_on_disk(request, ticket_id, ticket_data) def _store_in_db(self, request, ticket_id, ticket_data): - table = self._get_table(self.db, self.tablename, request.application) - table._db.rollback() - table.insert(ticket_id=ticket_id, - ticket_data=cPickle.dumps(ticket_data), - created_datetime=request.now) - table._db.commit() - logger.error('In FILE: %(layer)s\n\n%(traceback)s\n' % ticket_data) + self.db._adapter.reconnect() + try: + table = self._get_table(self.db, self.tablename, request.application) + id = table.insert(ticket_id=ticket_id, + ticket_data=cPickle.dumps(ticket_data), + created_datetime=request.now) + self.db.commit() + message = 'In FILE: %(layer)s\n\n%(traceback)s\n' + except Exception, e: + self.db.rollback() + message =' Unable to store in FILE: %(layer)s\n\n%(traceback)s\n' + self.db.close() + logger.error(message % ticket_data) def _store_on_disk(self, request, ticket_id, ticket_data): ef = self._error_file(request, ticket_id, 'wb') @@ -73,16 +79,13 @@ class TicketStorage(Storage): def _get_table(self, db, tablename, app): tablename = tablename + '_' + app - table = db.get(tablename, None) - if table is None: - db.rollback() # not necessary but one day - # any app may store tickets on DB + table = db.get(tablename) + if not table: table = db.define_table( tablename, db.Field('ticket_id', length=100), db.Field('ticket_data', 'text'), - db.Field('created_datetime', 'datetime'), - ) + db.Field('created_datetime', 'datetime')) return table def load(