blob: 405ea8e3b7f47b8d45bd1f100f134263254f7724 [file] [log] [blame]
#
# -*- coding: utf-8 -*-
#
# This file is part of reclass (http://github.com/madduck/reclass)
#
# Copyright © 2007–14 martin f. krafft <madduck@madduck.net>
# Released under the terms of the Artistic Licence 2.0
#
from reclass.storage import NodeStorageBase
STORAGE_NAME = 'memcache_proxy'
class MemcacheProxy(NodeStorageBase):
def __init__(self, real_storage, cache_classes=True, cache_nodes=True,
cache_nodelist=True):
name = '{0}({1})'.format(STORAGE_NAME, real_storage.name)
super(MemcacheProxy, self).__init__(name)
self._real_storage = real_storage
self._cache_classes = cache_classes
if cache_classes:
self._classes_cache = {}
self._cache_nodes = cache_nodes
if cache_nodes:
self._nodes_cache = {}
self._cache_nodelist = cache_nodelist
if cache_nodelist:
self._nodelist_cache = None
name = property(lambda self: self._real_storage.name)
def get_node(self, name, settings):
if not self._cache_nodes:
return self._real_storage.get_node(name, settings)
try:
return self._nodes_cache[name]
except KeyError, e:
ret = self._real_storage.get_node(name, settings)
self._nodes_cache[name] = ret
return ret
def get_class(self, name, environment, settings):
if not self._cache_classes:
return self._real_storage.get_class(name, environment, settings)
try:
return self._classes_cache[environment][name]
except KeyError, e:
if environment not in self._classes_cache:
self._classes_cache[environment] = dict()
ret = self._real_storage.get_class(name, environment, settings)
self._classes_cache[environment][name] = ret
return ret
def enumerate_nodes(self):
if not self._cache_nodelist:
return self._real_storage.enumerate_nodes()
elif self._nodelist_cache is None:
self._nodelist_cache = self._real_storage.enumerate_nodes()
return self._nodelist_cache