diff options
author | Marcin Raczkowski <marcin.raczkowski@gmail.com> | 2010-08-28 18:29:28 +0200 |
---|---|---|
committer | Emilio Tagua <miloops@gmail.com> | 2010-11-19 19:03:56 -0300 |
commit | 3df4460a742c18af8cc71e41009c9028467d16b5 (patch) | |
tree | 47c00279b3e026e966ff5142150e086fb3b5e19f /activerecord/lib | |
parent | 902ae14e650d87bc0ba3d34030c9bb38646c0d9f (diff) | |
download | rails-3df4460a742c18af8cc71e41009c9028467d16b5.tar.gz rails-3df4460a742c18af8cc71e41009c9028467d16b5.tar.bz2 rails-3df4460a742c18af8cc71e41009c9028467d16b5.zip |
IdentityMap - Adding Weakling and IM Base as concern
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record.rb | 2 | ||||
-rw-r--r-- | activerecord/lib/active_record/identity_map.rb | 64 |
2 files changed, 66 insertions, 0 deletions
diff --git a/activerecord/lib/active_record.rb b/activerecord/lib/active_record.rb index c80bce2849..ff6cf44a73 100644 --- a/activerecord/lib/active_record.rb +++ b/activerecord/lib/active_record.rb @@ -32,6 +32,7 @@ require 'active_support' require 'active_support/i18n' require 'active_model' require 'arel' +require 'weakling' require 'active_record/version' @@ -79,6 +80,7 @@ module ActiveRecord autoload :Timestamp autoload :Transactions autoload :Validations + autoload :IdentityMap end module AttributeMethods 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 |