summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2012-01-08 20:00:30 +0000
committerAymeric Augustin <aymeric.augustin@m4x.org>2012-01-08 20:00:30 +0000
commit19c544ff4250720558119084a60daa6363f45919 (patch)
tree96a0bae80db403a15b40ece0e2b29b590c4a0492
parent15d10a5210378bba88c7dfa1f45a4d3528ddfc3f (diff)
Fixed #17300 -- Prevented createcachetable from crashing when the cache table already exists. Thanks Claude Paroz.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17363 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/core/management/commands/createcachetable.py16
-rw-r--r--tests/regressiontests/cache/tests.py6
2 files changed, 18 insertions, 4 deletions
diff --git a/django/core/management/commands/createcachetable.py b/django/core/management/commands/createcachetable.py
index 287a036819..08fa5f2c3d 100644
--- a/django/core/management/commands/createcachetable.py
+++ b/django/core/management/commands/createcachetable.py
@@ -3,6 +3,7 @@ from optparse import make_option
from django.core.cache.backends.db import BaseDatabaseCache
from django.core.management.base import LabelCommand
from django.db import connections, router, transaction, models, DEFAULT_DB_ALIAS
+from django.db.utils import DatabaseError
class Command(LabelCommand):
help = "Creates the table needed to use the SQL cache backend."
@@ -51,7 +52,14 @@ class Command(LabelCommand):
full_statement.append(' %s%s' % (line, i < len(table_output)-1 and ',' or ''))
full_statement.append(');')
curs = connection.cursor()
- curs.execute("\n".join(full_statement))
- for statement in index_output:
- curs.execute(statement)
- transaction.commit_unless_managed(using=db)
+ try:
+ curs.execute("\n".join(full_statement))
+ except DatabaseError, e:
+ self.stderr.write(
+ self.style.ERROR("Cache table '%s' could not be created.\nThe error was: %s.\n" %
+ (tablename, e)))
+ transaction.rollback_unless_managed(using=db)
+ else:
+ for statement in index_output:
+ curs.execute(statement)
+ transaction.commit_unless_managed(using=db)
diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py
index d31a5e0d87..0e28f66ae8 100644
--- a/tests/regressiontests/cache/tests.py
+++ b/tests/regressiontests/cache/tests.py
@@ -7,6 +7,7 @@ from __future__ import with_statement, absolute_import
import hashlib
import os
import re
+import StringIO
import tempfile
import time
import warnings
@@ -817,6 +818,11 @@ class DBCacheTests(BaseCacheTests, TransactionTestCase):
self.cache = get_cache('db://%s?max_entries=30&cull_frequency=0' % self._table_name)
self.perform_cull_test(50, 18)
+ def test_second_call_doesnt_crash(self):
+ err = StringIO.StringIO()
+ management.call_command('createcachetable', self._table_name, verbosity=0, interactive=False, stderr=err)
+ self.assertTrue("Cache table 'test cache table' could not be created" in err.getvalue())
+
DBCacheWithTimeZoneTests = override_settings(USE_TZ=True)(DBCacheTests)