web/lib/django/db/__init__.py
author ymh <ymh.work@gmail.com>
Tue, 15 Mar 2011 10:34:41 +0100
changeset 65 3d18d15135f1
parent 38 77b6da96e6f1
permissions -rw-r--r--
put video url in segment object
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
from django.conf import settings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
from django.core import signals
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
from django.core.exceptions import ImproperlyConfigured
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.db.utils import ConnectionHandler, ConnectionRouter, load_backend, DEFAULT_DB_ALIAS, \
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
                            DatabaseError, IntegrityError
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
from django.utils.functional import curry
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
__all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
    'IntegrityError', 'DEFAULT_DB_ALIAS')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
# For backwards compatibility - Port any old database settings over to
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
# the new values.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
if not settings.DATABASES:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    import warnings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    warnings.warn(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
        "settings.DATABASE_* is deprecated; use settings.DATABASES instead.",
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
        PendingDeprecationWarning
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    settings.DATABASES[DEFAULT_DB_ALIAS] = {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
        'ENGINE': settings.DATABASE_ENGINE,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
        'HOST': settings.DATABASE_HOST,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
        'NAME': settings.DATABASE_NAME,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        'OPTIONS': settings.DATABASE_OPTIONS,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
        'PASSWORD': settings.DATABASE_PASSWORD,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
        'PORT': settings.DATABASE_PORT,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
        'USER': settings.DATABASE_USER,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
        'TEST_CHARSET': settings.TEST_DATABASE_CHARSET,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        'TEST_COLLATION': settings.TEST_DATABASE_COLLATION,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        'TEST_NAME': settings.TEST_DATABASE_NAME,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
if DEFAULT_DB_ALIAS not in settings.DATABASES:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    raise ImproperlyConfigured("You must default a '%s' database" % DEFAULT_DB_ALIAS)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
for alias, database in settings.DATABASES.items():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    if database['ENGINE'] in ("postgresql", "postgresql_psycopg2", "sqlite3", "mysql", "oracle"):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
        import warnings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
        if 'django.contrib.gis' in settings.INSTALLED_APPS:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
            warnings.warn(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
                "django.contrib.gis is now implemented as a full database backend. "
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
                "Modify ENGINE in the %s database configuration to select "
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
                "a backend from 'django.contrib.gis.db.backends'" % alias,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
                PendingDeprecationWarning
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
            )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            if database['ENGINE'] == 'postgresql_psycopg2':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
                full_engine = 'django.contrib.gis.db.backends.postgis'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
            elif database['ENGINE'] == 'sqlite3':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
                full_engine = 'django.contrib.gis.db.backends.spatialite'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
                full_engine = 'django.contrib.gis.db.backends.%s' % database['ENGINE']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
            warnings.warn(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
                "Short names for ENGINE in database configurations are deprecated. "
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
                "Prepend %s.ENGINE with 'django.db.backends.'" % alias,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
                PendingDeprecationWarning
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
            )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            full_engine = "django.db.backends.%s" % database['ENGINE']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        database['ENGINE'] = full_engine
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
connections = ConnectionHandler(settings.DATABASES)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
router = ConnectionRouter(settings.DATABASE_ROUTERS)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
# `connection`, `DatabaseError` and `IntegrityError` are convenient aliases
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
# for backend bits.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
# DatabaseWrapper.__init__() takes a dictionary, not a settings module, so
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
# we manually create the dictionary from the settings, passing only the
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
# settings that the database backends care about. Note that TIME_ZONE is used
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
# by the PostgreSQL backends.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
# we load all these up for backwards compatibility, you should use
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
# connections['default'] instead.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
connection = connections[DEFAULT_DB_ALIAS]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
backend = load_backend(connection.settings_dict['ENGINE'])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
# Register an event that closes the database connection
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
# when a Django request is finished.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
def close_connection(**kwargs):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    for conn in connections.all():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        conn.close()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
signals.request_finished.connect(close_connection)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
# Register an event that resets connection.queries
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
# when a Django request is started.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
def reset_queries(**kwargs):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    for conn in connections.all():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        conn.queries = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
signals.request_started.connect(reset_queries)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
# Register an event that rolls back the connections
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
# when a Django request has an exception.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
def _rollback_on_exception(**kwargs):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    from django.db import transaction
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    for conn in connections:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            transaction.rollback_unless_managed(using=conn)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        except DatabaseError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
            pass
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
signals.got_request_exception.connect(_rollback_on_exception)