aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/query_cache.rb
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2007-09-17 06:15:58 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2007-09-17 06:15:58 +0000
commitbfb906a905a1e8774e438b10e8cf703a829b55dc (patch)
treea24612f8ed74de3dec4519649488b817839f7dd5 /activerecord/lib/active_record/query_cache.rb
parent30fb7b8c8bfc72ed3097352539544c07cbb38d0d (diff)
downloadrails-bfb906a905a1e8774e438b10e8cf703a829b55dc.tar.gz
rails-bfb906a905a1e8774e438b10e8cf703a829b55dc.tar.bz2
rails-bfb906a905a1e8774e438b10e8cf703a829b55dc.zip
Speed up and simplify query caching.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7498 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib/active_record/query_cache.rb')
-rw-r--r--activerecord/lib/active_record/query_cache.rb128
1 files changed, 15 insertions, 113 deletions
diff --git a/activerecord/lib/active_record/query_cache.rb b/activerecord/lib/active_record/query_cache.rb
index 2cb9b97f8f..a8af89fcb9 100644
--- a/activerecord/lib/active_record/query_cache.rb
+++ b/activerecord/lib/active_record/query_cache.rb
@@ -1,119 +1,21 @@
module ActiveRecord
- class QueryCache #:nodoc:
- def initialize(connection)
- @connection = connection
- @query_cache = {}
- end
-
- def clear_query_cache
- @query_cache.clear
- end
-
- def select_all(sql, name = nil)
- cache(sql) { @connection.select_all(sql, name) }
- end
-
- def select_one(sql, name = nil)
- cache(sql) { @connection.select_one(sql, name) }
- end
-
- def select_values(sql, name = nil)
- cache(sql) { @connection.select_values(sql, name) }
- end
-
- def select_value(sql, name = nil)
- cache(sql) { @connection.select_value(sql, name) }
- end
-
- def execute(sql, name = nil)
- clear_query_cache
- @connection.execute(sql, name)
- end
-
- def columns(table_name, name = nil)
- @query_cache["SHOW FIELDS FROM #{table_name}"] ||= @connection.columns(table_name, name)
- end
-
- def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
- clear_query_cache
- @connection.insert(sql, name, pk, id_value, sequence_name)
- end
-
- def update(sql, name = nil)
- clear_query_cache
- @connection.update(sql, name)
- end
-
- def delete(sql, name = nil)
- clear_query_cache
- @connection.delete(sql, name)
- end
-
- private
- def cache(sql)
- result = if @query_cache.has_key?(sql)
- log_info(sql, "CACHE", 0.0)
- @query_cache[sql]
- else
- @query_cache[sql] = yield
- end
-
- case result
- when Array
- result.collect { |row| row.dup }
- when nil, Fixnum, Float, true, false
- result
- else
- result.dup
- end
- rescue TypeError
- result
- end
-
- def method_missing(method, *arguments, &proc)
- @connection.send(method, *arguments, &proc)
- end
- end
-
- class Base
- # Set the connection for the class with caching on
- class << self
- alias_method :connection_without_query_cache, :connection
-
- def query_caches
- Thread.current["query_cache_#{connection_without_query_cache.object_id}"] ||= {}
- end
-
- def query_cache
- if query_caches[self]
- query_caches[self]
- elsif superclass.respond_to?(:query_cache) and superclass.respond_to?(:connection) and superclass.connection_without_query_cache == connection_without_query_cache
- superclass.query_cache
- end
- end
-
- def query_cache=(cache)
- query_caches[self] = cache
- end
-
- # Use a query cache within the given block.
- def cache
- # Don't cache if Active Record is not configured.
- if ActiveRecord::Base.configurations.blank?
- yield
- else
- begin
- self.query_cache = QueryCache.new(connection_without_query_cache)
- yield
- ensure
- self.query_cache = nil
- end
- end
+ module QueryCache
+ # Enable the query cache within the block if Active Record is configured.
+ def cache(&block)
+ if ActiveRecord::Base.configurations.blank?
+ yield
+ else
+ connection.cache(&block)
end
+ end
- def connection
- query_cache || connection_without_query_cache
+ # Disable the query cache within the block if Active Record is configured.
+ def uncached(&block)
+ if ActiveRecord::Base.configurations.blank?
+ yield
+ else
+ connection.uncached(&block)
end
end
- end
+ end
end