[Erp5-report] r27345 - in /erp5/trunk/products/ERP5Type/CachePlugins: SQLCache.py ZODBCache.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Jun 3 11:06:55 CEST 2009


Author: nicolas
Date: Wed Jun  3 11:06:51 2009
New Revision: 27345

URL: http://svn.erp5.org?rev=27345&view=rev
Log:
Delete obsolete CachePlugins

Removed:
    erp5/trunk/products/ERP5Type/CachePlugins/SQLCache.py
    erp5/trunk/products/ERP5Type/CachePlugins/ZODBCache.py

Removed: erp5/trunk/products/ERP5Type/CachePlugins/SQLCache.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/CachePlugins/SQLCache.py?rev=27344&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Type/CachePlugins/SQLCache.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/CachePlugins/SQLCache.py (removed)
@@ -1,293 +1,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# Copyright (c) 2005 Nexedi SARL and Contributors. All Rights Reserved.
-#                     Ivan Tyagov <ivan at nexedi.com>
-#
-# WARNING: This program as such is intended to be used by professional
-# programmers who take the whole responsability of assessing all potential
-# consequences resulting from its eventual inadequacies and bugs
-# End users who are looking for a ready-to-use solution with commercial
-# garantees and support are strongly adviced to contract a Free Software
-# Service Company
-#
-# This program is Free Software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-##############################################################################
-
-"""
-SQL (MySQL) based cache plugin.
-"""
-
-from thread import get_ident
-import time
-import base64
-from zLOG import LOG
-from BaseCache import BaseCache, CacheEntry, CachedMethodError
-from Products.ERP5Type import interfaces
-import zope.interface
-
-try:
-  import cPickle as pickle
-except ImportError:
-  import pickle
-    
-try:
-  import MySQLdb
-  from MySQLdb.constants import CR
-  from _mysql_exceptions import OperationalError
-  hosed_connection = (
-      CR.SERVER_GONE_ERROR,
-      CR.SERVER_LOST
-      )
-except ImportError:
-  LOG('SQLCache', 0, 'unable to import MySQLdb')
-
-  
-## global ditionary containing connection objects
-connection_pool = {}
-  
-class SQLCache(BaseCache):
-  """ SQL based cache plugin. """
-
-  zope.interface.implements(
-        interfaces.ICachePlugin
-    )
-
-  cache_expire_check_interval = 3600
-    
-  create_table_sql = '''CREATE TABLE %s(cache_id VARBINARY(970) NOT NULL, 
-                                         value LONGBLOB,
-                                         scope VARBINARY(20),
-                                         stored_at INT,
-                                         cache_duration INT DEFAULT 0,
-                                         calculation_time FLOAT,
-                                         UNIQUE(cache_id, scope))
-                      '''
-
-  insert_key_sql = '''REPLACE INTO %s (cache_id, value, scope, stored_at, cache_duration, calculation_time) 
-                              VALUES("%s", "%s", "%s", %s, %s, %s)
-                    '''
-                            
-  has_key_sql = '''SELECT count(*)
-                    FROM %s
-                    WHERE cache_id = "%s" and scope="%s"
-                    '''
-                      
-  get_key_sql = '''SELECT value, cache_duration, calculation_time 
-                    FROM %s
-                    WHERE cache_id = "%s" and scope="%s"
-                    '''
-                            
-  delete_key_sql = '''DELETE
-                       FROM %s
-                       WHERE cache_id = "%s" and scope="%s"
-                    '''
-    
-  delete_all_keys_sql = '''DELETE 
-                            FROM %s
-                         '''
-    
-  delete_all_keys_for_scope_sql = '''DELETE 
-                                      FROM %s 
-                                      WHERE scope="%s"
-                                    '''
-        
-  delete_expired_keys_sql = '''DELETE 
-                                FROM %s
-                                WHERE cache_duration + stored_at < %s and cache_duration!=0
-                              '''
-  
-  get_scope_list_sql = '''SELECT scope 
-                           FROM %s 
-                           GROUP BY scope
-                        '''
-                           
-  get_scope_key_list_sql = '''SELECT cache_id 
-                                FROM %s 
-                                WHERE scope="%s"
-                            '''
-                            
-  find_table_by_name_sql = """SHOW TABLES LIKE '%s' """
-  
-  def __init__(self, params={}):
-    BaseCache.__init__(self)
-    self._dbConn = None
-    self._db_server = params.get('server', '')
-    self._db_user = params.get('user', '')
-    self._db_passwd = params.get('passwd', '')
-    self._db_name = params.get('db', '')
-    self._db_cache_table_name = params.get('cache_table_name')
-    
-    ## since SQL cache is persistent check for expired objects
-    #self.expireOldCacheEntries(forceCheck=True)
-  
-  def initCacheStorage(self):
-    """ Init cache backedn storage by creating needed cache table in RDBMS """
-    sql_query = self.find_table_by_name_sql %self._db_cache_table_name
-    cursor =  self.execSQLQuery(sql_query)
-    result = cursor.fetchall()
-    if 0 < len(result):
-      ## we have such table
-      pass
-    else:
-      ## no such table create it
-      self.execSQLQuery(self.create_table_sql %self._db_cache_table_name) 
-  
-  def getCacheStorage(self, **kw):
-    """ 
-    Return current DB connection or create a new one for this thread.
-    See http://sourceforge.net/docman/display_doc.php?docid=32071&group_id=22307
-    especially threadsafety part why we create for every thread a new MySQL db connection object.
-    """
-    force_reconnect = kw.get('force_reconnect', False)
-    global connection_pool
-    thread_id = get_ident()
-    
-    dbConn = connection_pool.get(thread_id, None)
-    if force_reconnect or dbConn is None:
-      ## we don't have dbConn for this thread
-      dbConn = MySQLdb.connect(host=self._db_server, \
-                               user=self._db_user,\
-                               passwd=self._db_passwd, \
-                               db=self._db_name)
-      connection_pool[thread_id] = dbConn
-      return dbConn      
-    else:
-      ## we have already dbConn for this thread 
-      return dbConn
-    
-  def get(self, cache_id, scope, default=None):
-    sql_query = self.get_key_sql %(self._db_cache_table_name, cache_id, scope)
-    cursor =  self.execSQLQuery(sql_query)
-    if cursor:
-      ## count return one row only
-      result = cursor.fetchall()
-      if 0 < len(result):
-        ## we found results
-        result = result[0]
-        decoded_result = pickle.loads(base64.decodestring(result[0]))
-        #self.markCacheHit()
-        cache_entry = CacheEntry(decoded_result, result[1], result[2])
-        return cache_entry
-      else:
-        ## no such cache_id in DB
-        return None
-    else:
-      ## DB not available
-      return None
-        
-  def set(self, cache_id, scope, value, cache_duration=None, calculation_time=0):
-    value = base64.encodestring(pickle.dumps(value,2))
-    if not cache_duration:
-      ## should live forever ==> setting cache_duration = 0 will make it live forever
-      cache_duration = 0
-    else:
-      ## we have strict cache_duration defined. we calculate seconds since start of epoch
-      cache_duration = int(cache_duration)
-    ## Set key in DB
-    stored_at = int(time.time())
-    sql_query = self.insert_key_sql %(self._db_cache_table_name, cache_id, value, scope, stored_at, cache_duration, calculation_time)
-    self.execSQLQuery(sql_query)
-    #self.markCacheMiss()
-            
-  def expireOldCacheEntries(self, forceCheck = False):
-    now = time.time()
-    if forceCheck or (now > self._next_cache_expire_check_at):
-      ## time to check for expired cache items
-      self._next_cache_expire_check_at = now + self.cache_expire_check_interval
-      my_query = self.delete_expired_keys_sql %(self._db_cache_table_name, now)
-      self.execSQLQuery(my_query)
-
-  def delete(self, cache_id, scope):
-    my_query = self.delete_key_sql %(self._db_cache_table_name, cache_id, scope)
-    self.execSQLQuery(my_query)
-    
-  def has_key(self, cache_id, scope):
-    my_query = self.has_key_sql %(self._db_cache_table_name, cache_id, scope)
-    cursor =  self.execSQLQuery(my_query)
-    if cursor:
-      ## count() SQL function will return one row only
-      result = cursor.fetchall()
-      result = result[0][0] 
-      if result == 0:
-        ## no such key in DB
-        return False
-      elif result==1:
-        ## we have this key in DB
-        return True
-      else:
-        ## something wrong in DB model
-        raise CachedMethodError, "Invalid cache table reltion format. cache_id MUST be unique!"
-    else:
-      ## DB not available
-      return False
-
-  def getScopeList(self):
-    rl = []
-    my_query = self.get_scope_list_sql %(self._db_cache_table_name)
-    cursor =  self.execSQLQuery(my_query)
-    results = cursor.fetchall() 
-    for result in results:
-        rl.append(result[0])
-    return rl
-    
-  def getScopeKeyList(self, scope):
-    rl = []
-    my_query = self.get_scope_key_list_sql %(self._db_cache_table_name, scope)
-    cursor =  self.execSQLQuery(my_query)
-    results = cursor.fetchall() 
-    for result in results:
-        rl.append(result[0])
-    return rl
-    
-  def clearCache(self):
-    BaseCache.clearCache(self)
-    ## SQL Cache is a persistent storage rather than delete all entries
-    ## just expire them 
-    ## self.expireOldCacheEntries(forceCheck = True):
-    my_query = self.delete_all_keys_sql  %(self._db_cache_table_name)
-    self.execSQLQuery(my_query)
-    
-  def clearCacheForScope(self, scope):
-    my_query = self.delete_all_keys_for_scope_sql  %(self._db_cache_table_name, scope)
-    self.execSQLQuery(my_query)
-
-  def _execSQLQuery(self, sql_query, connection):
-    """
-      Execute sql query using given connection.
-    """
-    cursor = connection.cursor()
-    cursor.execute(sql_query)
-    return cursor
-
-  def execSQLQuery(self, sql_query):
-    """ 
-    Try to execute sql query.
-    Return cursor object because some queris can return result
-    """
-    dbConn = self.getCacheStorage()
-    try:
-      cursor = self._execSQLQuery(sql_query, dbConn)
-    except OperationalError, m:
-      if m[0] not in hosed_connection:
-        raise
-      dbConn = self.getCacheStorage(force_reconnect=True)
-      cursor = self._execSQLQuery(sql_query, dbConn)
-    return cursor
-
-  def getCachePluginTotalMemorySize(self):
-    """ Calculate total RAM memory size of cache plugin. """
-    return 0       

Removed: erp5/trunk/products/ERP5Type/CachePlugins/ZODBCache.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/CachePlugins/ZODBCache.py?rev=27344&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Type/CachePlugins/ZODBCache.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/CachePlugins/ZODBCache.py (removed)
@@ -1,138 +1,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved.
-#                     Nicolas Delaby <nicolas at nexedi.com>
-#
-# WARNING: This program as such is intended to be used by professional
-# programmers who take the whole responsability of assessing all potential
-# consequences resulting from its eventual inadequacies and bugs
-# End users who are looking for a ready-to-use solution with commercial
-# garantees and support are strongly adviced to contract a Free Software
-# Service Company
-#
-# This program is Free Software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-##############################################################################
-
-"""
-ZODB Based cache plugin.
-"""
-import time
-from BaseCache import BaseCache, CacheEntry
-from BTrees.OOBTree import OOBTree
-from Products.ERP5Type import interfaces
-import zope.interface
-
-PRIVATE_ATTRIBUTE_ZODB_CACHE_NAME = '_zodb_cache'
-
-class ZODBCache(BaseCache):
-  """ ZODB based cache plugin."""
-
-  zope.interface.implements(
-        interfaces.ICachePlugin
-    )
-
-  cache_tool = None
-  cache_expire_check_interval = 300
-
-  def __init__(self, params={}):
-    BaseCache.__init__(self)
-    self.cache_tool = params.get('cache_tool')
-
-  def initCacheStorage(self):
-    """Init cache storage
-    Btree is enough for less than 1 Million entries.
-    For higher scalability, wee need to implement cache with hierarchical Btree
-    with clever key generator
-    """
-    if getattr(self.cache_tool, PRIVATE_ATTRIBUTE_ZODB_CACHE_NAME, None) is None:
-      self.cache_tool._zodb_cache = OOBTree()
-
-  def getCacheStorage(self, **kw):
-    return getattr(self.cache_tool, PRIVATE_ATTRIBUTE_ZODB_CACHE_NAME)
-
-  def get(self, cache_id, scope, default=None):
-    cache = self.getCacheStorage()
-    try:
-      cache_entry = cache[(scope, cache_id)]
-      # Note: tracking down cache hit could be achieved by uncommenting
-      # methods below. In production environment this is likely uneeded
-      #cache_entry.markCacheHit()
-      #self.markCacheHit()
-      return cache_entry
-    except KeyError:
-      pass
-    return default
-
-  def set(self, cache_id, scope, value, cache_duration=None, calculation_time=0):
-    cache = self.getCacheStorage()
-    cache[(scope, cache_id)] = CacheEntry(value, cache_duration, calculation_time)
-    #self.markCacheMiss()
-
-  def expireOldCacheEntries(self, forceCheck = False):
-    now = time.time()
-    if forceCheck or (now > self._next_cache_expire_check_at):
-      ## time to check for expired cache items
-      self._next_cache_expire_check_at = now + self.cache_expire_check_interval
-      cache = self.getCacheStorage()
-      for key, value in cache.items():
-        if value.isExpired():
-          try:
-            del cache[key]
-          except KeyError:
-            # The key might have disappeared, due to multi-threading.
-            pass
-
-  def delete(self, cache_id, scope):
-    try:
-      del self.getCacheStorage()[(scope, cache_id)]
-    except KeyError:
-      pass
-
-  def has_key(self, cache_id, scope):
-    cache = self.getCacheStorage()
-    return cache.has_key((scope, cache_id))
-
-  def getScopeList(self):
-    scope_set = set()
-    for scope, cache_id in self.getCacheStorage().iterkeys():
-      scope_set.add(scope)
-    return list(scope_set)
-
-  def getScopeKeyList(self, scope):
-    key_list = []
-    for key in self.getCacheStorage().iterkeys():
-      if scope == key[0]:
-        key_list.append(key[1])
-    return key_list
-
-  def clearCache(self):
-    BaseCache.clearCache(self)
-    self.getCacheStorage().clear()
-
-  def clearCacheForScope(self, scope):
-    cache = self.getCacheStorage()
-    for key in cache.keys():
-      if key[0] == scope:
-        try:
-          del cache[key]
-        except KeyError:
-          # The key might have disappeared, due to multi-threading.
-          pass
-
-  def getCachePluginTotalMemorySize(self):
-    """Not Implemented"""
-    return 0




More information about the Erp5-report mailing list