diff -r b758351d191f -r cc9b7e14412b web/lib/django/db/backends/postgresql/base.py --- a/web/lib/django/db/backends/postgresql/base.py Wed May 19 17:43:59 2010 +0200 +++ b/web/lib/django/db/backends/postgresql/base.py Tue May 25 02:43:45 2010 +0200 @@ -4,6 +4,9 @@ Requires psycopg 1: http://initd.org/projects/psycopg1 """ +import sys + +from django.db import utils from django.db.backends import * from django.db.backends.signals import connection_created from django.db.backends.postgresql.client import DatabaseClient @@ -50,11 +53,21 @@ return tuple([smart_str(p, self.charset, True) for p in params]) def execute(self, sql, params=()): - return self.cursor.execute(smart_str(sql, self.charset), self.format_params(params)) + try: + return self.cursor.execute(smart_str(sql, self.charset), self.format_params(params)) + except Database.IntegrityError, e: + raise utils.IntegrityError, utils.IntegrityError(*tuple(e)), sys.exc_info()[2] + except Database.DatabaseError, e: + raise utils.DatabaseError, utils.DatabaseError(*tuple(e)), sys.exc_info()[2] def executemany(self, sql, param_list): - new_param_list = [self.format_params(params) for params in param_list] - return self.cursor.executemany(sql, new_param_list) + try: + new_param_list = [self.format_params(params) for params in param_list] + return self.cursor.executemany(sql, new_param_list) + except Database.IntegrityError, e: + raise utils.IntegrityError, utils.IntegrityError(*tuple(e)), sys.exc_info()[2] + except Database.DatabaseError, e: + raise utils.DatabaseError, utils.DatabaseError(*tuple(e)), sys.exc_info()[2] def __getattr__(self, attr): if attr in self.__dict__: @@ -63,7 +76,7 @@ return getattr(self.cursor, attr) def __iter__(self): - return iter(self.cursor) + return iter(self.cursor.fetchall()) class DatabaseFeatures(BaseDatabaseFeatures): uses_savepoints = True @@ -89,44 +102,52 @@ def __init__(self, *args, **kwargs): super(DatabaseWrapper, self).__init__(*args, **kwargs) + import warnings + warnings.warn( + 'The "postgresql" backend has been deprecated. Use "postgresql_psycopg2" instead.', + PendingDeprecationWarning + ) + self.features = DatabaseFeatures() - self.ops = DatabaseOperations() + self.ops = DatabaseOperations(self) self.client = DatabaseClient(self) self.creation = DatabaseCreation(self) self.introspection = DatabaseIntrospection(self) - self.validation = BaseDatabaseValidation() + self.validation = BaseDatabaseValidation(self) def _cursor(self): + new_connection = False set_tz = False settings_dict = self.settings_dict if self.connection is None: - set_tz = True - if settings_dict['DATABASE_NAME'] == '': + new_connection = True + set_tz = settings_dict.get('TIME_ZONE') + if settings_dict['NAME'] == '': from django.core.exceptions import ImproperlyConfigured - raise ImproperlyConfigured("You need to specify DATABASE_NAME in your Django settings file.") - conn_string = "dbname=%s" % settings_dict['DATABASE_NAME'] - if settings_dict['DATABASE_USER']: - conn_string = "user=%s %s" % (settings_dict['DATABASE_USER'], conn_string) - if settings_dict['DATABASE_PASSWORD']: - conn_string += " password='%s'" % settings_dict['DATABASE_PASSWORD'] - if settings_dict['DATABASE_HOST']: - conn_string += " host=%s" % settings_dict['DATABASE_HOST'] - if settings_dict['DATABASE_PORT']: - conn_string += " port=%s" % settings_dict['DATABASE_PORT'] - self.connection = Database.connect(conn_string, **settings_dict['DATABASE_OPTIONS']) + raise ImproperlyConfigured("You need to specify NAME in your Django settings file.") + conn_string = "dbname=%s" % settings_dict['NAME'] + if settings_dict['USER']: + conn_string = "user=%s %s" % (settings_dict['USER'], conn_string) + if settings_dict['PASSWORD']: + conn_string += " password='%s'" % settings_dict['PASSWORD'] + if settings_dict['HOST']: + conn_string += " host=%s" % settings_dict['HOST'] + if settings_dict['PORT']: + conn_string += " port=%s" % settings_dict['PORT'] + self.connection = Database.connect(conn_string, **settings_dict['OPTIONS']) self.connection.set_isolation_level(1) # make transactions transparent to all cursors connection_created.send(sender=self.__class__) cursor = self.connection.cursor() - if set_tz: - cursor.execute("SET TIME ZONE %s", [settings_dict['TIME_ZONE']]) + if new_connection: + if set_tz: + cursor.execute("SET TIME ZONE %s", [settings_dict['TIME_ZONE']]) if not hasattr(self, '_version'): self.__class__._version = get_version(cursor) if self._version[0:2] < (8, 0): # No savepoint support for earlier version of PostgreSQL. self.features.uses_savepoints = False - cursor.execute("SET client_encoding to 'UNICODE'") - cursor = UnicodeCursorWrapper(cursor, 'utf-8') - return cursor + cursor.execute("SET client_encoding to 'UNICODE'") + return UnicodeCursorWrapper(cursor, 'utf-8') def typecast_string(s): """ @@ -142,7 +163,7 @@ try: Database.register_type(Database.new_type((1082,), "DATE", util.typecast_date)) except AttributeError: - raise Exception("You appear to be using psycopg version 2. Set your DATABASE_ENGINE to 'postgresql_psycopg2' instead of 'postgresql'.") + raise Exception("You appear to be using psycopg version 2. Set your DATABASES.ENGINE to 'postgresql_psycopg2' instead of 'postgresql'.") Database.register_type(Database.new_type((1083,1266), "TIME", util.typecast_time)) Database.register_type(Database.new_type((1114,1184), "TIMESTAMP", util.typecast_timestamp)) Database.register_type(Database.new_type((16,), "BOOLEAN", util.typecast_boolean))