[Erp5-report] r13032 - /erp5/trunk/products/ERP5Type/Cache.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Feb 26 16:05:32 CET 2007
Author: aurel
Date: Mon Feb 26 16:05:30 2007
New Revision: 13032
URL: http://svn.erp5.org?rev=13032&view=rev
Log:
display a warning message to let user know a cache factory is missing
Modified:
erp5/trunk/products/ERP5Type/Cache.py
Modified: erp5/trunk/products/ERP5Type/Cache.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Cache.py?rev=13032&r1=13031&r2=13032&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Cache.py (original)
+++ erp5/trunk/products/ERP5Type/Cache.py Mon Feb 26 16:05:30 2007
@@ -30,7 +30,7 @@
from time import time
from AccessControl.SecurityInfo import allow_class
from CachePlugins.BaseCache import CachedMethodError
-from zLOG import LOG
+from zLOG import LOG, WARNING
DEFAULT_CACHE_SCOPE = 'GLOBAL'
DEFAULT_CACHE_FACTORY = 'erp5_user_interface'
@@ -44,26 +44,26 @@
is_cache_initialized = 1
## update cache structure from portal_caches
self.getPortalObject().portal_caches.updateCache()
-
+
class CacheFactory:
""" CacheFactory is a RAM based object which contains different cache plugin
objects ordered in a list.
"""
-
+
cache_plugins = []
cache_duration = 180
-
+
def __init__(self, cache_plugins, cache_params):
self.cache_plugins = cache_plugins
self.cache_duration = cache_params.get('cache_duration')
-
+
## separete local and shared cache plugins
self.quick_cache = self.cache_plugins[0]
try:
self.shared_caches =self.cache_plugins[1:]
except IndexError:
self.shared_caches = []
-
+
## set 'check_expire_cache_interval' to the minimal value between
## individual 'check_expire_cache_interval' for each cache plugin contained
l = []
@@ -72,13 +72,13 @@
l.append(cp.cache_expire_check_interval)
l = filter(lambda x: x!=None and x!=0, l)
self.cache_expire_check_interval = min(l)
-
+
def __call__(self, callable_object, cache_id, scope, cache_duration=None, *args, **kwd):
""" When CacheFactory is called it will try to return cached value using
appropriate cache plugin.
"""
cache_duration = self.cache_duration
-
+
## Expired Cache (if needed)
self.expire()
@@ -96,14 +96,14 @@
cache_entry.cache_duration,
cache_entry.calculation_time)
return value
-
+
## not in any available cache plugins calculate and set to local ..
start = time()
value = callable_object(*args, **kwd)
end = time()
calculation_time = end - start
self.quick_cache.set(cache_id, scope, value, cache_duration, calculation_time)
-
+
## .. and update rest of caches in chain except already updated local one
for shared_cache in self.shared_caches:
shared_cache.set(cache_id, scope, value, cache_duration, calculation_time)
@@ -116,15 +116,15 @@
self._last_cache_expire_check_at = now
for cache_plugin in self.getCachePluginList():
cache_plugin.expireOldCacheEntries()
-
+
def getCachePluginList(self, omit_cache_plugin_name=None):
- """ get list of all cache plugins except specified by name in omit """
+ """ get list of all cache plugins except specified by name in omit """
rl = []
for cp in self.cache_plugins:
if omit_cache_plugin_name != cp.__class__.__name__:
rl.append(cp)
return rl
-
+
def getCachePluginByClassName(self, cache_plugin_name):
""" get cache plugin by its class name """
for cp in self.cache_plugins:
@@ -136,26 +136,26 @@
""" clear cache for this cache factory """
for cp in self.cache_plugins:
cp.clearCache()
-
+
class CachingMethod:
"""CachingMethod is a RAM based global Zope class which contains different
CacheFactory objects for every available ERP5 site instance.
"""
-
+
## cache factories will be initialized for every ERP5 site
factories = {}
-
+
## replace string table for some control characters not allowed in cache id
_cache_id_translate_table = string.maketrans("""[]()<>'", """,'__________')
-
+
def __init__(self, callable_object, id, cache_duration=180,
cache_factory=DEFAULT_CACHE_FACTORY):
"""Wrap a callable object in a caching method.
-
+
callable_object must be callable.
id is used to identify what call should be treated as the same call.
- cache_duration is an old argument kept for backwards compatibility.
- cache_duration is specified per cache factory.
+ cache_duration is an old argument kept for backwards compatibility.
+ cache_duration is specified per cache factory.
cache_factory is the id of the cache_factory to use.
"""
if not callable(callable_object):
@@ -167,18 +167,18 @@
self.callable_object = callable_object
self.cache_duration = cache_duration
self.cache_factory = cache_factory
-
+
def __call__(self, *args, **kwd):
"""Call the method or return cached value using appropriate cache plugin """
-
+
## cache scope is based on user which is a kwd argument
scope = kwd.get('scope', DEFAULT_CACHE_SCOPE)
-
+
## generate unique cache id
cache_id = self.generateCacheId(self.id, *args, **kwd)
try:
- ## try to get value from cache in a try block
+ ## try to get value from cache in a try block
## which is faster than checking for keys
# It is very important to take the factories dictionnary
# on CachingMethod instead of self, we want a global variable
@@ -187,6 +187,7 @@
*args, **kwd)
except KeyError:
## no caching enabled for this site or no such cache factory
+ LOG("Cache.__call__", WARNING, "Factory %s not found, method %s execute without cache" %(self.cache_factory, self.callable_object))
value = self.callable_object(*args, **kwd)
return value
@@ -200,8 +201,8 @@
def generateCacheId(self, method_id, *args, **kwd):
""" Generate proper cache id based on *args and **kwd """
## generate cache id out of arguments passed.
- ## depending on arguments we may have different
- ## cache_id for same method_id
+ ## depending on arguments we may have different
+ ## cache_id for same method_id
cache_id = [method_id]
key_list = kwd.keys()
key_list.sort()
@@ -214,7 +215,7 @@
# sure to replace them
cache_id = cache_id.translate(self._cache_id_translate_table)
return cache_id
-
+
allow_class(CachingMethod)
# TransactionCache is a cache per transaction. The purpose of this cache is
@@ -247,7 +248,7 @@
"""Clear specified cache factory list."""
cache_storage = CachingMethod.factories
for cf_key in cache_factory_list:
- if cache_storage.has_key(cf_key):
+ if cache_storage.has_key(cf_key):
for cp in cache_storage[cf_key].getCachePluginList():
cp.clearCache()
More information about the Erp5-report
mailing list