diff options
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r-- | activerecord/lib/active_record/identity_map.rb | 64 |
1 files changed, 64 insertions, 0 deletions
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 |