Commit 1617557a authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Added BaseDatabaseWrapper.ensure_connection.

This API is useful because autocommit cannot be managed without an open
connection.
parent 7b4815b4
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -86,11 +86,10 @@ class BaseDatabaseWrapper(object):
        """Creates a cursor. Assumes that a connection is established."""
        raise NotImplementedError

    ##### Backend-specific wrappers for PEP-249 connection methods #####
    ##### Backend-specific methods for creating connections #####

    def _cursor(self):
        with self.wrap_database_errors():
            if self.connection is None:
    def connect(self):
        """Connects to the database. Assumes that the connection is closed."""
        # Reset parameters defining when to close the connection
        max_age = self.settings_dict['CONN_MAX_AGE']
        self.close_at = None if max_age is None else time.time() + max_age
@@ -100,6 +99,20 @@ class BaseDatabaseWrapper(object):
        self.connection = self.get_new_connection(conn_params)
        self.init_connection_state()
        connection_created.send(sender=self.__class__, connection=self)

    def ensure_connection(self):
        """
        Guarantees that a connection to the database is established.
        """
        if self.connection is None:
            with self.wrap_database_errors():
                self.connect()

    ##### Backend-specific wrappers for PEP-249 connection methods #####

    def _cursor(self):
        self.ensure_connection()
        with self.wrap_database_errors():
            return self.create_cursor()

    def _commit(self):
@@ -285,6 +298,7 @@ class BaseDatabaseWrapper(object):
        """
        Enable or disable autocommit.
        """
        self.ensure_connection()
        self._set_autocommit(autocommit)
        self.autocommit = autocommit

+0 −4
Original line number Diff line number Diff line
@@ -169,8 +169,6 @@ class DatabaseWrapper(BaseDatabaseWrapper):
        Switch the isolation level when needing transaction support, so that
        the same transaction is visible across all the queries.
        """
        if self.connection is None:             # Force creating a connection.
            self.cursor().close()
        if managed and self.autocommit:
            self.set_autocommit(False)

@@ -179,8 +177,6 @@ class DatabaseWrapper(BaseDatabaseWrapper):
        If the normal operating mode is "autocommit", switch back to that when
        leaving transaction management.
        """
        if self.connection is None:             # Force creating a connection.
            self.cursor().close()
        if not managed and not self.autocommit:
            self.rollback()                     # Must terminate transaction first.
            self.set_autocommit(True)