コード例 #1
0
ファイル: query_cache.py プロジェクト: dalinhuang/demodemo
 def __init__(self, expire_time=60 * 30, fields=[], dao=None):
     """
     fields = (name, index, sql_type?)
     """
     self.table_name = "cache_%s_temp" % self.__class__.__name__.lower()
     self.cache_fields = dict(( (e[0], e) for e in fields ))
     self.sql_parser = RawSQLResult()
     self.dao = dao or QueryUtils(logging.getLogger("query.cache"))
     self.ordered_fields = fields
     self.expire_time = expire_time
     
     if not self.exists_cache_table(): self.create_cache_table()
コード例 #2
0
ファイル: query_cache.py プロジェクト: dalinhuang/demodemo
class BasicCache(object):
    def __init__(self, expire_time=60 * 30, fields=[], dao=None):
        """
        fields = (name, index, sql_type?)
        """
        self.table_name = "cache_%s_temp" % self.__class__.__name__.lower()
        self.cache_fields = dict(( (e[0], e) for e in fields ))
        self.sql_parser = RawSQLResult()
        self.dao = dao or QueryUtils(logging.getLogger("query.cache"))
        self.ordered_fields = fields
        self.expire_time = expire_time
        
        if not self.exists_cache_table(): self.create_cache_table()
    
    def update_query(self, query_or_sessionkey, sql=None, ignore_cache=False):
        update_result = """insert into ${cache_table_name}(query_id, ${cache_fields})
           select ${query_id}, ${cache_fields} from (${sql}) a
        """
        
        created = query = None
        if isinstance(query_or_sessionkey, basestring):
            query, created = Query.objects.get_or_create(session_key=query_or_sessionkey)
        elif isinstance(query_or_sessionkey, Query):
            query = query_or_sessionkey
        else:
            raise RuntimeError, "need a 'Query' object or session key."
        
        cached_time = datetime.now() - query.last_updated_time
        cached_time = cached_time.seconds + cached_time.days * 60 * 60 * 24
        
        if created or ignore_cache or query.cached_time > self.expire_time:
            if created:
                query.name = self.__class__.__name__
            elif query.name and query.name != self.__class__.__name__:
                raise RuntimeError, "cache name:%s!=%s, key=%s" % (query.name,
                                                                   self.__class__.__name__,
                                                                   query.session_key)

            self.clean_cache(query)
            sql_fields = self.sql_parser.parse_sql_fields(sql)
            sql_fields = [ e for e in sql_fields if e in self.cache_fields ]
            update_sql, vars = self.dao.replace_sql_parameter(update_result, 
                                                        {"cache_table_name": self.table_name,
                                                         "query_id": query.id,
                                                         "cache_fields": ",".join(sql_fields),
                                                         "sql":sql
                                                         })
            self.dao.execute_sql(update_sql, (), close_cursor=True)
            query.sql = sql
            query.last_updated_time = datetime.now()
        
        query.last_access_time = datetime.now()
        query.save()
        
        return query
    
    def clean_cache(self, query):
        delete_sql = "delete from %s where query_id=%s" % (self.table_name,
                                                           query.id)
        self.dao.execute_sql(delete_sql, (), close_cursor=True)

    def get_cache_key(self, *query):
        return hashlib.md5(";".join(query)).hexdigest()
    
    def exists_cache_table(self, ):
        try:
            self.dao.execute_sql("select 1 from %s where 1=2" % self.table_name, ())
            return True
        except Exception, e:
            if "doesn't exist" in str(e):
                return False
            else:
                raise