Django

Code

Show
Ignore:
Timestamp:
12/18/07 23:20:55 (1 year ago)
Author:
jkocherhans
Message:

newforms-admin: Merged from trunk up to [6952].

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin

    • Property svnmerge-integrated changed from /django/trunk:1-4345,4350-4357,4359-4365,4371-4372,4374-4377,4380-4386,4388,4390-4391,4400-4402,4404-4408,4410,4412-4419,4426-4427,4430-4432,4434,4441,4443-4444,4446-4447,4450,4452-4453,4455-4458,4476,4503,4546,4564-4569,4580-4586,4617,4630,4641-6390,6392-6863 to /django/trunk:1-4345,4350-4357,4359-4365,4371-4372,4374-4377,4380-4386,4388,4390-4391,4400-4402,4404-4408,4410,4412-4419,4426-4427,4430-4432,4434,4441,4443-4444,4446-4447,4450,4452-4453,4455-4458,4476,4503,4546,4564-4569,4580-4586,4617,4630,4641-6390,6392-6952
  • django/branches/newforms-admin/django/core/cache/backends/filebased.py

    r6864 r6955  
    11"File-based cache backend" 
    22 
     3import md5 
    34import os, time 
    45try: 
     
    78    import pickle 
    89from django.core.cache.backends.base import BaseCache 
    9 from django.utils.http import urlquote_plus 
    1010 
    1111class CacheClass(BaseCache): 
     
    3030 
    3131    def add(self, key, value, timeout=None): 
    32         fname = self._key_to_file(key) 
    33         if timeout is None: 
    34             timeout = self.default_timeout 
    35         try: 
    36             filelist = os.listdir(self._dir) 
    37         except (IOError, OSError): 
    38             self._createdir() 
    39             filelist = [] 
    40         if len(filelist) > self._max_entries: 
    41             self._cull(filelist) 
    42         if os.path.basename(fname) not in filelist: 
    43             try: 
    44                 f = open(fname, 'wb') 
    45                 now = time.time() 
    46                 pickle.dump(now + timeout, f, 2) 
    47                 pickle.dump(value, f, 2) 
    48             except (IOError, OSError): 
    49                 pass 
     32        if self.has_key(key): 
     33            return None 
     34         
     35        self.set(key, value, timeout) 
    5036 
    5137    def get(self, key, default=None): 
     
    5743            if exp < now: 
    5844                f.close() 
    59                 os.remove(fname) 
     45                self._delete(fname) 
    6046            else: 
    6147                return pickle.load(f) 
     
    6652    def set(self, key, value, timeout=None): 
    6753        fname = self._key_to_file(key) 
     54        dirname = os.path.dirname(fname) 
     55         
    6856        if timeout is None: 
    6957            timeout = self.default_timeout 
     58             
     59        self._cull() 
     60         
    7061        try: 
    71             filelist = os.listdir(self._dir) 
    72         except (IOError, OSError): 
    73             self._createdir() 
    74             filelist = [] 
    75         if len(filelist) > self._max_entries: 
    76             self._cull(filelist) 
    77         try: 
     62            if not os.path.exists(dirname): 
     63                os.makedirs(dirname) 
     64 
    7865            f = open(fname, 'wb') 
    7966            now = time.time() 
    80             pickle.dump(now + timeout, f, 2
    81             pickle.dump(value, f, 2
     67            pickle.dump(now + timeout, f, pickle.HIGHEST_PROTOCOL
     68            pickle.dump(value, f, pickle.HIGHEST_PROTOCOL
    8269        except (IOError, OSError): 
    8370            pass 
     
    8572    def delete(self, key): 
    8673        try: 
    87             os.remove(self._key_to_file(key)) 
     74            self._delete(self._key_to_file(key)) 
     75        except (IOError, OSError): 
     76            pass 
     77 
     78    def _delete(self, fname): 
     79        os.remove(fname) 
     80        try: 
     81            # Remove the 2 subdirs if they're empty 
     82            dirname = os.path.dirname(fname) 
     83            os.rmdir(dirname) 
     84            os.rmdir(os.path.dirname(dirname)) 
    8885        except (IOError, OSError): 
    8986            pass 
    9087 
    9188    def has_key(self, key): 
    92         return os.path.exists(self._key_to_file(key)) 
     89        fname = self._key_to_file(key) 
     90        try: 
     91            f = open(fname, 'rb') 
     92            exp = pickle.load(f) 
     93            now = time.time() 
     94            if exp < now: 
     95                f.close() 
     96                self._delete(fname) 
     97                return False 
     98            else: 
     99                return True 
     100        except (IOError, OSError, EOFError, pickle.PickleError): 
     101            return False 
    93102 
    94     def _cull(self, filelist): 
     103    def _cull(self): 
     104        if int(self._num_entries) < self._max_entries: 
     105            return 
     106         
     107        try: 
     108            filelist = os.listdir(self._dir) 
     109        except (IOError, OSError): 
     110            return 
     111         
    95112        if self._cull_frequency == 0: 
    96113            doomed = filelist 
    97114        else: 
    98             doomed = [k for (i, k) in enumerate(filelist) if i % self._cull_frequency == 0] 
    99         for fname in doomed: 
     115            doomed = [os.path.join(self._dir, k) for (i, k) in enumerate(filelist) if i % self._cull_frequency == 0] 
     116 
     117        for topdir in doomed: 
    100118            try: 
    101                 os.remove(os.path.join(self._dir, fname)) 
     119                for root, _, files in os.walk(topdir): 
     120                    for f in files: 
     121                        self._delete(os.path.join(root, f)) 
    102122            except (IOError, OSError): 
    103123                pass 
     
    110130 
    111131    def _key_to_file(self, key): 
    112         return os.path.join(self._dir, urlquote_plus(key)) 
     132        """ 
     133        Convert the filename into an md5 string. We'll turn the first couple 
     134        bits of the path into directory prefixes to be nice to filesystems 
     135        that have problems with large numbers of files in a directory. 
     136         
     137        Thus, a cache key of "foo" gets turnned into a file named 
     138        ``{cache-dir}ac/bd/18db4cc2f85cedef654fccc4a4d8``. 
     139        """ 
     140        path = md5.new(key.encode('utf-8')).hexdigest() 
     141        path = os.path.join(path[:2], path[2:4], path[4:]) 
     142        return os.path.join(self._dir, path) 
     143 
     144    def _get_num_entries(self): 
     145        count = 0 
     146        for _,_,files in os.walk(self._dir): 
     147            count += len(files) 
     148        return count 
     149    _num_entries = property(_get_num_entries) 
     150 
  • django/branches/newforms-admin/django/core/cache/backends/locmem.py

    r6864 r6955  
    3030        self._lock = RWLock() 
    3131 
    32     def _add(self, key, value, timeout=None): 
    33         if len(self._cache) >= self._max_entries: 
    34             self._cull() 
    35         if timeout is None: 
    36             timeout = self.default_timeout 
    37         if key not in self._cache.keys(): 
    38             self._cache[key] = value 
    39             self._expire_info[key] = time.time() + timeout 
    40  
    4132    def add(self, key, value, timeout=None): 
    4233        self._lock.writer_enters() 
    43         # Python 2.3 and 2.4 don't allow combined try-except-finally blocks. 
    4434        try: 
    45             try: 
    46                 self._add(key, pickle.dumps(value), timeout) 
    47             except pickle.PickleError: 
    48                 pass 
     35            exp = self._expire_info.get(key) 
     36            if exp is None or exp <= time.time(): 
     37                try: 
     38                    self._set(key, pickle.dumps(value), timeout) 
     39                except pickle.PickleError: 
     40                    pass 
    4941        finally: 
    5042            self._lock.writer_leaves() 
    5143 
    5244    def get(self, key, default=None): 
    53         should_delete = False 
    5445        self._lock.reader_enters() 
    5546        try: 
    56             now = time.time() 
    5747            exp = self._expire_info.get(key) 
    5848            if exp is None: 
    5949                return default 
    60             elif exp < now: 
    61                 should_delete = True 
    62             else: 
     50            elif exp > time.time(): 
    6351                try: 
    6452                    return pickle.loads(self._cache[key]) 
     
    6755        finally: 
    6856            self._lock.reader_leaves() 
    69         if should_delete: 
    70             self._lock.writer_enters() 
    71             try: 
    72                 del self._cache[key] 
    73                 del self._expire_info[key] 
    74                 return default 
    75             finally: 
    76                 self._lock.writer_leaves() 
     57        self._lock.writer_enters() 
     58        try: 
     59            del self._cache[key] 
     60            del self._expire_info[key] 
     61            return default 
     62        finally: 
     63            self._lock.writer_leaves() 
    7764 
    7865    def _set(self, key, value, timeout=None): 
     
    9683 
    9784    def has_key(self, key): 
    98         return key in self._cache 
     85        self._lock.reader_enters() 
     86        try: 
     87            exp = self._expire_info.get(key) 
     88            if exp is None: 
     89                return False 
     90            elif exp > time.time(): 
     91                return True 
     92        finally: 
     93            self._lock.reader_leaves() 
     94 
     95        self._lock.writer_enters() 
     96        try: 
     97            del self._cache[key] 
     98            del self._expire_info[key] 
     99            return False 
     100        finally: 
     101            self._lock.writer_leaves() 
    99102 
    100103    def _cull(self):