Edgewall Software

Ticket #8510: t8510-Section-cache-r8720.diff

File t8510-Section-cache-r8720.diff, 2.5 KB (added by cboos, 3 years ago)

Add a cache in Section objects.

  • trac/config.py

     
    2828 
    2929_TRUE_VALUES = ('yes', 'true', 'enabled', 'on', 'aye', '1', 1, True) 
    3030 
     31_use_default = object() 
     32 
    3133def _to_utf8(basestr): 
    3234    return to_unicode(basestr).encode('utf-8') 
    3335 
     
    237239        changed = False 
    238240        modtime = os.path.getmtime(self.filename) 
    239241        if modtime > self._lastmtime: 
     242            self._sections = {} 
    240243            self.parser._sections = {} 
    241244            self.parser.read(self.filename) 
    242245            self._lastmtime = modtime 
     
    272275     
    273276    Objects of this class should not be instantiated directly. 
    274277    """ 
    275     __slots__ = ['config', 'name', 'overridden'] 
     278    __slots__ = ['config', 'name', 'overridden', '_cache'] 
    276279 
    277280    def __init__(self, config, name): 
    278281        self.config = config 
    279282        self.name = name 
    280283        self.overridden = {} 
     284        self._cache = {} 
    281285 
    282286    def __contains__(self, key): 
    283287        if self.config.parser.has_option(_to_utf8(self.name), _to_utf8(key)): 
     
    311315         
    312316        Valid default input is a string. Returns a string. 
    313317        """ 
     318        cached = self._cache.get(key, _use_default) 
     319        if cached is not _use_default: 
     320            return cached 
    314321        name_str = _to_utf8(self.name) 
    315322        key_str = _to_utf8(key) 
    316323        if self.config.parser.has_option(name_str, key_str): 
     
    320327        else: 
    321328            option = Option.registry.get((self.name, key)) 
    322329            if option: 
    323                 value = option.default or default 
     330                value = option.default or _use_default 
    324331            else: 
    325                 value = default 
     332                value = _use_default 
     333        if value is _use_default: 
     334            return default 
    326335        if not value: 
    327             return u'' 
     336            value = u'' 
    328337        elif isinstance(value, basestring): 
    329             return to_unicode(value) 
    330         else: 
    331             return value 
     338            value = to_unicode(value) 
     339        self._cache[key] = value 
     340        return value 
    332341 
    333342    def getbool(self, key, default=''): 
    334343        """Return the value of the specified option as boolean. 
     
    418427         
    419428        These changes are not persistent unless saved with `save()`. 
    420429        """ 
     430        self._cache.pop(key, None) 
    421431        name_str = _to_utf8(self.name) 
    422432        key_str = _to_utf8(key) 
    423433        if not self.config.parser.has_section(name_str):