Code

Ticket #900: 900.4.patch

File 900.4.patch, 3.8 KB (added by Maniac <Maniac@…>, 8 years ago)

Updated to current magic-removal branch

  • django/db/backends/postgresql/base.py

     
    66 
    77from django.db.backends import util 
    88import psycopg as Database 
     9from threading import currentThread  
     10from django.utils.synch import RWLock 
    911 
    1012DatabaseError = Database.DatabaseError 
    1113 
     
    1315    def __init__(self): 
    1416        self.connection = None 
    1517        self.queries = [] 
     18        self._lock = RWLock() 
     19        self._active_threads = [] 
    1620 
    1721    def cursor(self): 
    1822        from django.conf import settings 
    19         if self.connection is None: 
    20             if settings.DATABASE_NAME == '': 
    21                 from django.core.exceptions import ImproperlyConfigured 
    22                 raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file." 
    23             conn_string = "dbname=%s" % settings.DATABASE_NAME 
    24             if settings.DATABASE_USER: 
    25                 conn_string = "user=%s %s" % (settings.DATABASE_USER, conn_string) 
    26             if settings.DATABASE_PASSWORD: 
    27                 conn_string += " password='%s'" % settings.DATABASE_PASSWORD 
    28             if settings.DATABASE_HOST: 
    29                 conn_string += " host=%s" % settings.DATABASE_HOST 
    30             if settings.DATABASE_PORT: 
    31                 conn_string += " port=%s" % settings.DATABASE_PORT 
    32             self.connection = Database.connect(conn_string) 
    33             self.connection.set_isolation_level(1) # make transactions transparent to all cursors 
     23        self._lock.writer_enters() 
     24        try: 
     25            if self.connection is None: 
     26                if settings.DATABASE_NAME == '': 
     27                    from django.core.exceptions import ImproperlyConfigured 
     28                    raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file." 
     29                conn_string = "dbname=%s" % settings.DATABASE_NAME 
     30                if settings.DATABASE_USER: 
     31                    conn_string = "user=%s %s" % (settings.DATABASE_USER, conn_string) 
     32                if settings.DATABASE_PASSWORD: 
     33                    conn_string += " password='%s'" % settings.DATABASE_PASSWORD 
     34                if settings.DATABASE_HOST: 
     35                    conn_string += " host=%s" % settings.DATABASE_HOST 
     36                if settings.DATABASE_PORT: 
     37                    conn_string += " port=%s" % settings.DATABASE_PORT 
     38                self.connection = Database.connect(conn_string) 
     39                self.connection.set_isolation_level(1) # make transactions transparent to all cursors 
     40                if not currentThread() in self._active_threads: 
     41                    self._active_threads.append(currentThread()) 
     42        finally: 
     43            self._lock.writer_leaves() 
    3444        cursor = self.connection.cursor() 
    3545        cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE]) 
    3646        if settings.DEBUG: 
     
    4151        return self.connection.commit() 
    4252 
    4353    def rollback(self): 
    44         if self.connection: 
    45             return self.connection.rollback() 
     54        self._lock.reader_enters() 
     55        try: 
     56            if self.connection: 
     57                return self.connection.rollback() 
     58        finally: 
     59            self._lock.reader_leaves() 
    4660 
    4761    def close(self): 
    48         if self.connection is not None: 
    49             self.connection.close() 
    50             self.connection = None 
     62        self._lock.writer_enters() 
     63        try: 
     64            if currentThread() in self._active_threads: 
     65                self._active_threads.remove(currentThread()) 
     66            if not self._active_threads and self.connection is not None: 
     67                self.connection.close() 
     68                self.connection = None 
     69        finally: 
     70            self._lock.writer_leaves() 
    5171 
    5272supports_constraints = True 
    5373