module ActiveRecord::ConnectionAdapters::QueryCache
def cache
def cache old, @query_cache_enabled = @query_cache_enabled, true @query_cache ||= {} yield ensure clear_query_cache @query_cache_enabled = old end
def cache_sql(sql)
def cache_sql(sql) result = if @query_cache.has_key?(sql) log_info(sql, "CACHE", 0.0) @query_cache[sql] else @query_cache[sql] = yield end if Array === result result.collect { |row| row.dup } else result.duplicable? ? result.dup : result end rescue TypeError result end
def clear_query_cache
the same SQL query and repeatedly return the same result each time, silently
that ask the database to randomize results. Otherwise the cache would see
One reason you may wish to call this method explicitly is between queries
Clears the query cache.
def clear_query_cache @query_cache.clear if @query_cache end
def columns_with_query_cache(*args)
def columns_with_query_cache(*args) if @query_cache_enabled @query_cache["SHOW FIELDS FROM #{args.first}"] ||= columns_without_query_cache(*args) else columns_without_query_cache(*args) end end
def dirties_query_cache(base, *method_names)
def dirties_query_cache(base, *method_names) method_names.each do |method_name| base.class_eval <<-end_code, __FILE__, __LINE__ + 1 def #{method_name}_with_query_dirty(*args) # def update_with_query_dirty(*args) clear_query_cache if @query_cache_enabled # clear_query_cache if @query_cache_enabled #{method_name}_without_query_dirty(*args) # update_without_query_dirty(*args) end # end # alias_method_chain :#{method_name}, :query_dirty # alias_method_chain :update, :query_dirty end_code end end
def included(base)
def included(base) base.class_eval do alias_method_chain :columns, :query_cache alias_method_chain :select_all, :query_cache end dirties_query_cache base, :insert, :update, :delete end
def select_all_with_query_cache(*args)
def select_all_with_query_cache(*args) if @query_cache_enabled cache_sql(args.first) { select_all_without_query_cache(*args) } else select_all_without_query_cache(*args) end end
def uncached
def uncached old, @query_cache_enabled = @query_cache_enabled, false yield ensure @query_cache_enabled = old end