Author: ramiro
Date: 2011-07-06 16:25:30 -0700 (Wed, 06 Jul 2011)
New Revision: 16520

Modified:
   django/trunk/django/db/backends/creation.py
   django/trunk/django/db/backends/oracle/creation.py
   django/trunk/django/db/backends/postgresql_psycopg2/creation.py
   django/trunk/django/db/backends/sqlite3/creation.py
Log:
Fixed #16250 -- Made test database creation support code in the PostgreSQL DB 
backend compatible with psycopg2 2.4.2.

Implemented this by adding an internal hook for work that should be performed
before that point.

Also, regarding the `DatabaseCreation.set_autocommit()` method:
 * Stop using it for such tasks
 * Stop providing an implementation that tries to cover all the possible
   idioms a third party database backend DB-API 2 driver could need to activate
   autocommit. It is now left for third party backends to implement.

This can be backwards incompatible in the case of user applications that:
 * Had started using this method
 * Use a third a party database backend

Modified: django/trunk/django/db/backends/creation.py
===================================================================
--- django/trunk/django/db/backends/creation.py 2011-07-06 10:28:18 UTC (rev 
16519)
+++ django/trunk/django/db/backends/creation.py 2011-07-06 23:25:30 UTC (rev 
16520)
@@ -247,7 +247,7 @@
             verbosity=max(verbosity - 1, 0),
             interactive=False,
             database=self.connection.alias)
-        
+
         # One effect of calling syncdb followed by flush is that the id of the
         # default site may or may not be 1, depending on how the sequence was
         # reset.  If the sites app is loaded, then we coerce it.
@@ -294,7 +294,7 @@
         # if the database supports it because PostgreSQL doesn't allow
         # CREATE/DROP DATABASE statements within transactions.
         cursor = self.connection.cursor()
-        self.set_autocommit()
+        self._prepare_for_test_db_ddl()
         try:
             cursor.execute("CREATE DATABASE %s %s" % (qn(test_database_name), 
suffix))
         except Exception, e:
@@ -339,21 +339,28 @@
         # to do so, because it's not allowed to delete a database while being
         # connected to it.
         cursor = self.connection.cursor()
-        self.set_autocommit()
+        self._prepare_for_test_db_ddl()
         time.sleep(1) # To avoid "database is being accessed by other users" 
errors.
         cursor.execute("DROP DATABASE %s" % 
self.connection.ops.quote_name(test_database_name))
         self.connection.close()
 
     def set_autocommit(self):
-        "Make sure a connection is in autocommit mode."
-        if hasattr(self.connection.connection, "autocommit"):
-            if callable(self.connection.connection.autocommit):
-                self.connection.connection.autocommit(True)
-            else:
-                self.connection.connection.autocommit = True
-        elif hasattr(self.connection.connection, "set_isolation_level"):
-            self.connection.connection.set_isolation_level(0)
+        """
+        Make sure a connection is in autocommit mode. - Deprecated, not used
+        anymore by Django code. Kept for compatibility with user code that
+        might use it.
+        """
+        pass
 
+    def _prepare_for_test_db_ddl(self):
+        """
+        Internal implementation - Hook for tasks that should be performed 
before
+        the ``CREATE DATABASE``/``DROP DATABASE`` clauses used by testing code
+        to create/ destroy test databases. Needed e.g. in PostgreSQL to 
rollback
+        and close any active transaction.
+        """
+        pass
+
     def sql_table_creation_suffix(self):
         "SQL to append to the end of the test table creation statements"
         return ''

Modified: django/trunk/django/db/backends/oracle/creation.py
===================================================================
--- django/trunk/django/db/backends/oracle/creation.py  2011-07-06 10:28:18 UTC 
(rev 16519)
+++ django/trunk/django/db/backends/oracle/creation.py  2011-07-06 23:25:30 UTC 
(rev 16520)
@@ -270,3 +270,6 @@
             settings_dict['NAME'],
             self._test_database_user(),
         )
+
+    def set_autocommit(self):
+        self.connection.connection.autocommit = True

Modified: django/trunk/django/db/backends/postgresql_psycopg2/creation.py
===================================================================
--- django/trunk/django/db/backends/postgresql_psycopg2/creation.py     
2011-07-06 10:28:18 UTC (rev 16519)
+++ django/trunk/django/db/backends/postgresql_psycopg2/creation.py     
2011-07-06 23:25:30 UTC (rev 16520)
@@ -76,3 +76,11 @@
         else:
             output = []
         return output
+
+    def set_autocommit(self):
+        self._prepare_for_test_db_ddl()
+
+    def _prepare_for_test_db_ddl(self):
+        """Rollback and close the active transaction."""
+        self.connection.connection.rollback()
+        self.connection.connection.set_isolation_level(0)

Modified: django/trunk/django/db/backends/sqlite3/creation.py
===================================================================
--- django/trunk/django/db/backends/sqlite3/creation.py 2011-07-06 10:28:18 UTC 
(rev 16519)
+++ django/trunk/django/db/backends/sqlite3/creation.py 2011-07-06 23:25:30 UTC 
(rev 16520)
@@ -69,3 +69,6 @@
         if test_database_name and test_database_name != ":memory:":
             # Remove the SQLite database file
             os.remove(test_database_name)
+
+    def set_autocommit(self):
+        self.connection.connection.isolation_level = None

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to