Attempt to catch the OperationalError which is thrown when MySQL closes the connection without telling us.

This commit is contained in:
Raoul Snyman 2012-02-12 11:24:06 +02:00
parent fd5a04cc84
commit f8a8185eb0
1 changed files with 75 additions and 6 deletions

View File

@ -239,6 +239,16 @@ class Manager(object):
self.session.commit()
self.is_dirty = True
return True
except OperationalError:
# This exception clause is for users running MySQL which likes
# to terminate connections on its own without telling anyone.
# See bug #927473
self.session.rollback()
self.session.add(object_instance)
if commit:
self.session.commit()
self.is_dirty = True
return True
except InvalidRequestError:
self.session.rollback()
log.exception(u'Object save failed')
@ -260,6 +270,16 @@ class Manager(object):
self.session.commit()
self.is_dirty = True
return True
except OperationalError:
# This exception clause is for users running MySQL which likes
# to terminate connections on its own without telling anyone.
# See bug #927473
self.session.rollback()
self.session.add_all(object_list)
if commit:
self.session.commit()
self.is_dirty = True
return True
except InvalidRequestError:
self.session.rollback()
log.exception(u'Object list save failed')
@ -278,7 +298,14 @@ class Manager(object):
if not key:
return object_class()
else:
return self.session.query(object_class).get(key)
try:
return self.session.query(object_class).get(key)
except OperationalError:
# This exception clause is for users running MySQL which likes
# to terminate connections on its own without telling anyone.
# See bug #927473
self.session.rollback()
return self.session.query(object_class).get(key)
def get_object_filtered(self, object_class, filter_clause):
"""
@ -290,7 +317,14 @@ class Manager(object):
``filter_clause``
The criteria to select the object by
"""
return self.session.query(object_class).filter(filter_clause).first()
try:
return self.session.query(object_class).filter(filter_clause).first()
except OperationalError:
# This exception clause is for users running MySQL which likes
# to terminate connections on its own without telling anyone.
# See bug #927473
self.session.rollback()
return self.session.query(object_class).filter(filter_clause).first()
def get_all_objects(self, object_class, filter_clause=None,
order_by_ref=None):
@ -311,10 +345,17 @@ class Manager(object):
if filter_clause is not None:
query = query.filter(filter_clause)
if isinstance(order_by_ref, list):
return query.order_by(*order_by_ref).all()
query = query.order_by(*order_by_ref)
elif order_by_ref is not None:
return query.order_by(order_by_ref).all()
return query.all()
query = query.order_by(order_by_ref)
try:
return query.all()
except OperationalError:
# This exception clause is for users running MySQL which likes
# to terminate connections on its own without telling anyone.
# See bug #927473
self.session.rollback()
return query.all()
def get_object_count(self, object_class, filter_clause=None):
"""
@ -330,7 +371,14 @@ class Manager(object):
query = self.session.query(object_class)
if filter_clause is not None:
query = query.filter(filter_clause)
return query.count()
try:
return query.count()
except OperationalError:
# This exception clause is for users running MySQL which likes
# to terminate connections on its own without telling anyone.
# See bug #927473
self.session.rollback()
return query.count()
def delete_object(self, object_class, key):
"""
@ -349,6 +397,15 @@ class Manager(object):
self.session.commit()
self.is_dirty = True
return True
except OperationalError:
# This exception clause is for users running MySQL which likes
# to terminate connections on its own without telling anyone.
# See bug #927473
self.session.rollback()
self.session.delete(object_instance)
self.session.commit()
self.is_dirty = True
return True
except InvalidRequestError:
self.session.rollback()
log.exception(u'Failed to delete object')
@ -378,6 +435,18 @@ class Manager(object):
self.session.commit()
self.is_dirty = True
return True
except OperationalError:
# This exception clause is for users running MySQL which likes
# to terminate connections on its own without telling anyone.
# See bug #927473
self.session.rollback()
query = self.session.query(object_class)
if filter_clause is not None:
query = query.filter(filter_clause)
query.delete(synchronize_session=False)
self.session.commit()
self.is_dirty = True
return True
except InvalidRequestError:
self.session.rollback()
log.exception(u'Failed to delete %s records', object_class.__name__)