diff --git a/docs/changelog.rst b/docs/changelog.rst --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -23,6 +23,8 @@ fixes - fixes #368 improved git-protocol detection to handle other clients - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be Moved To Root +- fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys + 1.3.1 (**2012-02-27**) ---------------------- diff --git a/rhodecode/lib/caching_query.py b/rhodecode/lib/caching_query.py --- a/rhodecode/lib/caching_query.py +++ b/rhodecode/lib/caching_query.py @@ -24,6 +24,7 @@ from beaker.exceptions import BeakerExce from sqlalchemy.orm.interfaces import MapperOption from sqlalchemy.orm.query import Query from sqlalchemy.sql import visitors +from rhodecode.lib import safe_str class CachingQuery(Query): @@ -137,9 +138,10 @@ def _get_cache_parameters(query): if cache_key is None: # cache key - the value arguments from this query's parameters. - args = [str(x) for x in _params_from_query(query)] - args.extend(filter(lambda k:k not in ['None', None, u'None'], + args = [safe_str(x) for x in _params_from_query(query)] + args.extend(filter(lambda k: k not in ['None', None, u'None'], [str(query._limit), str(query._offset)])) + cache_key = " ".join(args) if cache_key is None: diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -44,6 +44,7 @@ from rhodecode.lib.compat import json from rhodecode.lib.caching_query import FromCache from rhodecode.model.meta import Base, Session +import hashlib log = logging.getLogger(__name__) @@ -52,6 +53,8 @@ log = logging.getLogger(__name__) # BASE CLASSES #============================================================================== +_hash_key = lambda k: hashlib.md5(safe_str(k)).hexdigest() + class ModelSerializer(json.JSONEncoder): """ @@ -337,8 +340,11 @@ class User(Base, BaseModel): q = cls.query().filter(cls.username == username) if cache: - q = q.options(FromCache("sql_cache_short", - "get_user_%s" % username)) + q = q.options(FromCache( + "sql_cache_short", + "get_user_%s" % _hash_key(username) + ) + ) return q.scalar() @classmethod @@ -418,8 +424,11 @@ class UsersGroup(Base, BaseModel): else: q = cls.query().filter(cls.users_group_name == group_name) if cache: - q = q.options(FromCache("sql_cache_short", - "get_user_%s" % group_name)) + q = q.options(FromCache( + "sql_cache_short", + "get_user_%s" % _hash_key(group_name) + ) + ) return q.scalar() @classmethod @@ -748,8 +757,11 @@ class RepoGroup(Base, BaseModel): gr = cls.query()\ .filter(cls.group_name == group_name) if cache: - gr = gr.options(FromCache("sql_cache_short", - "get_group_%s" % group_name)) + gr = gr.options(FromCache( + "sql_cache_short", + "get_group_%s" % _hash_key(group_name) + ) + ) return gr.scalar() @property