Commit 3eb80748 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Added savepoint protection to get_or_create() to avoid problems on PostgreSQL.

Fixed #7402.

Also made savepoint handling easier to use when wrapped around calls that might
commit a transaction. This is tested by the get_or_create tests.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@8315 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 220993bc
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -326,9 +326,12 @@ class QuerySet(object):
                params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
                params.update(defaults)
                obj = self.model(**params)
                sid = transaction.savepoint()
                obj.save()
                transaction.savepoint_commit(sid)
                return obj, True
            except IntegrityError, e:
                transaction.savepoint_rollback(sid)
                return self.get(**kwargs), False

    def latest(self, field_name=None):
+11 −2
Original line number Diff line number Diff line
@@ -105,6 +105,12 @@ def set_clean():
        dirty[thread_ident] = False
    else:
        raise TransactionManagementError("This code isn't under transaction management")
    clean_savepoints()

def clean_savepoints():
    thread_ident = thread.get_ident()
    if thread_ident in savepoint_state:
        del savepoint_state[thread_ident]

def is_managed():
    """
@@ -139,6 +145,7 @@ def commit_unless_managed():
    """
    if not is_managed():
        connection._commit()
        clean_savepoints()
    else:
        set_dirty()

@@ -186,6 +193,7 @@ def savepoint_rollback(sid):
    Rolls back the most recent savepoint (if one exists). Does nothing if
    savepoints are not supported.
    """
    if thread.get_ident() in savepoint_state:
        connection._savepoint_rollback(sid)

def savepoint_commit(sid):
@@ -193,6 +201,7 @@ def savepoint_commit(sid):
    Commits the most recent savepoint (if one exists). Does nothing if
    savepoints are not supported.
    """
    if thread.get_ident() in savepoint_state:
        connection._savepoint_commit(sid)

##############