From 3df4460a742c18af8cc71e41009c9028467d16b5 Mon Sep 17 00:00:00 2001 From: Marcin Raczkowski Date: Sat, 28 Aug 2010 18:29:28 +0200 Subject: IdentityMap - Adding Weakling and IM Base as concern --- activerecord/lib/active_record/identity_map.rb | 64 ++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 activerecord/lib/active_record/identity_map.rb (limited to 'activerecord/lib/active_record/identity_map.rb') diff --git a/activerecord/lib/active_record/identity_map.rb b/activerecord/lib/active_record/identity_map.rb new file mode 100644 index 0000000000..79eb4dd83a --- /dev/null +++ b/activerecord/lib/active_record/identity_map.rb @@ -0,0 +1,64 @@ +module ActiveRecord + module IdentityMap + extend ActiveSupport::Concern + + class << self + attr_accessor :repositories + attr_accessor :current_repository_name + attr_accessor :enabled + + def current + repositories[current_repository_name] ||= Weakling::WeakHash.new + end + + def with_repository(name = :default, &block) + old_repository = self.current_repository_name + self.current_repository_name = name + + block.call(current) + ensure + self.current_repository_name = old_repository + end + + def without(&block) + old, self.enabled = self.enabled, false + + block.call + ensure + self.enabled = old + end + + def get(class_name, primary_key) + current[[class_name, primary_key]] + end + + def add(record) + current[[record.class.name, record.id]] = record + end + + def remove(record) + current.delete([record.class.name, record.id]) + end + + def clear + current.clear + end + + alias enabled? enabled + end + + self.repositories ||= Hash.new + self.current_repository_name ||= :default + self.enabled = true + + module InstanceMethods + + end + + module ClassMethods + def identity_map + ActiveRecord::IdentityMap + end + end + end +end -- cgit v1.2.3