Refactored implementation of savepoints.

Prepared for using savepoints within transactions in autocommit mode.
This commit is contained in:
Aymeric Augustin 2013-03-01 10:09:22 +01:00
parent 918f44e3ae
commit e264f67174
1 changed files with 24 additions and 19 deletions

View File

@ -176,53 +176,58 @@ class BaseDatabaseWrapper(object):
##### Backend-specific savepoint management methods ##### ##### Backend-specific savepoint management methods #####
def _savepoint(self, sid): def _savepoint(self, sid):
if not self.features.uses_savepoints or self.autocommit:
return
self.cursor().execute(self.ops.savepoint_create_sql(sid)) self.cursor().execute(self.ops.savepoint_create_sql(sid))
def _savepoint_rollback(self, sid): def _savepoint_rollback(self, sid):
if not self.features.uses_savepoints or self.autocommit:
return
self.cursor().execute(self.ops.savepoint_rollback_sql(sid)) self.cursor().execute(self.ops.savepoint_rollback_sql(sid))
def _savepoint_commit(self, sid): def _savepoint_commit(self, sid):
if not self.features.uses_savepoints or self.autocommit:
return
self.cursor().execute(self.ops.savepoint_commit_sql(sid)) self.cursor().execute(self.ops.savepoint_commit_sql(sid))
def _savepoint_allowed(self):
# Savepoints cannot be created outside a transaction
return self.features.uses_savepoints and not self.autocommit
##### Generic savepoint management methods ##### ##### Generic savepoint management methods #####
def savepoint(self): def savepoint(self):
""" """
Creates a savepoint (if supported and required by the backend) inside the Creates a savepoint inside the current transaction. Returns an
current transaction. Returns an identifier for the savepoint that will be identifier for the savepoint that will be used for the subsequent
used for the subsequent rollback or commit. rollback or commit. Does nothing if savepoints are not supported.
""" """
if not self._savepoint_allowed():
return
thread_ident = thread.get_ident() thread_ident = thread.get_ident()
tid = str(thread_ident).replace('-', '')
self.savepoint_state += 1 self.savepoint_state += 1
tid = str(thread_ident).replace('-', '')
sid = "s%s_x%d" % (tid, self.savepoint_state) sid = "s%s_x%d" % (tid, self.savepoint_state)
self.validate_thread_sharing()
self._savepoint(sid) self._savepoint(sid)
return sid return sid
def savepoint_rollback(self, sid): def savepoint_rollback(self, sid):
""" """
Rolls back the most recent savepoint (if one exists). Does nothing if Rolls back to a savepoint. Does nothing if savepoints are not supported.
savepoints are not supported.
""" """
if not self._savepoint_allowed():
return
self.validate_thread_sharing() self.validate_thread_sharing()
if self.savepoint_state:
self._savepoint_rollback(sid) self._savepoint_rollback(sid)
def savepoint_commit(self, sid): def savepoint_commit(self, sid):
""" """
Commits the most recent savepoint (if one exists). Does nothing if Releases a savepoint. Does nothing if savepoints are not supported.
savepoints are not supported.
""" """
if not self._savepoint_allowed():
return
self.validate_thread_sharing() self.validate_thread_sharing()
if self.savepoint_state:
self._savepoint_commit(sid) self._savepoint_commit(sid)
def clean_savepoints(self): def clean_savepoints(self):