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()
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