1 # HG changeset patch 2 # User Paul Boddie <paul@boddie.org.uk> 3 # Date 1390585706 -3600 4 # Node ID 70250fe93a4f946e51eaa63accbb0152054ddab2 5 # Parent d57b620213dd68126d2e5800f173d89f0602403a 6 Added caching support for the "pageparams" dependency where the request 7 parameters are combined with the page name to make a cache entry. 8 9 diff -r d57b620213dd -r 70250fe93a4f MoinMoin/Page.py 10 --- a/MoinMoin/Page.py Tue Jul 30 17:41:42 2013 +0200 11 +++ b/MoinMoin/Page.py Fri Jan 24 18:48:26 2014 +0100 12 @@ -41,6 +41,7 @@ 13 14 from MoinMoin import config, caching, user, util, wikiutil 15 from MoinMoin.logfile import eventlog 16 +from MoinMoin.support.python_compatibility import hash_new 17 18 def is_cache_exception(e): 19 args = e.args 20 @@ -1336,7 +1337,7 @@ 21 22 def loadCache(self, request): 23 """ Return page content cache or raises 'CacheNeedsUpdate' """ 24 - cache = caching.CacheEntry(request, self, self.getFormatterName(), scope='item') 25 + cache = caching.CacheEntry(request, self, self.getCacheKey(request), scope='item') 26 attachmentsPath = self.getPagePath('attachments', check_create=0) 27 if cache.needsUpdate(self._text_filename(), attachmentsPath): 28 raise Exception('CacheNeedsUpdate') 29 @@ -1357,7 +1358,7 @@ 30 """ Format content into code, update cache and return code """ 31 import marshal 32 from MoinMoin.formatter.text_python import Formatter 33 - formatter = Formatter(request, ["page"], self.formatter) 34 + formatter = Formatter(request, ["page", "pageparams"], self.formatter) 35 36 # Save request state while formatting page 37 saved_current_lang = request.current_lang 38 @@ -1369,10 +1370,39 @@ 39 src = formatter.assemble_code(text) 40 code = compile(src.encode(config.charset), 41 self.page_name.encode(config.charset), 'exec') 42 - cache = caching.CacheEntry(request, self, self.getFormatterName(), scope='item') 43 + self.enforceCacheLimit(request) 44 + cache = caching.CacheEntry(request, self, self.getCacheKey(request), scope='item') 45 cache.update(marshal.dumps(code)) 46 return code 47 48 + def enforceCacheLimit(self, request): 49 + """ Prevent too many cache entries being stored for a page """ 50 + keys = caching.get_cache_list(request, self, 'item') 51 + try: 52 + cache_limit = int(getattr(request.cfg, 'page_cache_limit', "10")) 53 + except ValueError: 54 + cache_limit = 10 55 + 56 + if len(keys) >= cache_limit: 57 + items = [caching.CacheEntry(request, self, key, scope='item') for key in keys] 58 + item_ages = [(item.mtime(), item) for item in items] 59 + item_ages.sort() 60 + for item_age, item in item_ages[:-cache_limit]: 61 + item.remove() 62 + 63 + def getCacheKey(self, request): 64 + """ Generate a cache key for a page using optional request information """ 65 + key = self.getFormatterName() 66 + if request.args: 67 + args = request.args.items() 68 + args.sort() 69 + key_args = [] 70 + for k, v in args: 71 + key_args.append("%s=%s" % (k, wikiutil.url_quote(v))) 72 + arg_str = "&".join(key_args) 73 + key = "%s:%s" % (key, hash_new('sha1', arg_str).hexdigest()) 74 + return key 75 + 76 def _specialPageText(self, request, special_type): 77 """ Output the default page content for new pages. 78 79 # HG changeset patch 80 # User Paul Boddie <paul@boddie.org.uk> 81 # Date 1390599896 -3600 82 # Node ID 02d1fa8951523776357a9a37235ad5c37f42fcc8 83 # Parent 70250fe93a4f946e51eaa63accbb0152054ddab2 84 Acquire the request formatter name when the page formatter has not yet been set. 85 86 diff -r 70250fe93a4f -r 02d1fa895152 MoinMoin/Page.py 87 --- a/MoinMoin/Page.py Fri Jan 24 18:48:26 2014 +0100 88 +++ b/MoinMoin/Page.py Fri Jan 24 22:44:56 2014 +0100 89 @@ -1240,15 +1240,17 @@ 90 request.formatter = old_formatter 91 92 93 - def getFormatterName(self): 94 + def getFormatterName(self, request=None): 95 """ Return a formatter name as used in the caching system 96 97 + @param request: the active request (optional) 98 @rtype: string 99 @return: formatter name as used in caching 100 """ 101 - if not hasattr(self, 'formatter') or self.formatter is None: 102 + formatter = getattr(self, 'formatter', None) or request and getattr(request, 'formatter', None) 103 + if not formatter: 104 return '' 105 - module = self.formatter.__module__ 106 + module = formatter.__module__ 107 return module[module.rfind('.') + 1:] 108 109 def canUseCache(self, parser=None): 110 @@ -1392,7 +1394,7 @@ 111 112 def getCacheKey(self, request): 113 """ Generate a cache key for a page using optional request information """ 114 - key = self.getFormatterName() 115 + key = self.getFormatterName(request) 116 if request.args: 117 args = request.args.items() 118 args.sort()