diff --git a/README.rdoc b/README.rdoc index 3aa6e08..dd0769b 100644 --- a/README.rdoc +++ b/README.rdoc @@ -32,7 +32,8 @@ master database. === Install - gem install schoefmax-multi_db --source http://gems.github.com + gem sources --add http://gems.github.com # only if you haven't already added github + gem install schoefmax-multi_db When using Rails, add this to your environment.rb: diff --git a/lib/multi_db.rb b/lib/multi_db.rb index 7456d15..28703f6 100644 --- a/lib/multi_db.rb +++ b/lib/multi_db.rb @@ -1,4 +1,4 @@ -require 'multi_db/thread_local_accessors' +require 'tlattr_accessors' require 'multi_db/scheduler' require 'multi_db/active_record_extensions' require 'multi_db/observer_extensions' diff --git a/lib/multi_db/connection_proxy.rb b/lib/multi_db/connection_proxy.rb index 0437bc5..4867902 100644 --- a/lib/multi_db/connection_proxy.rb +++ b/lib/multi_db/connection_proxy.rb @@ -13,8 +13,7 @@ class ConnectionProxy DEFAULT_MASTER_MODELS = ['CGI::Session::ActiveRecordStore::Session'] attr_accessor :master - tlattr_accessor :master_depth - tlattr_accessor :current + tlattr_accessor :master_depth, :current, true class << self diff --git a/lib/multi_db/scheduler.rb b/lib/multi_db/scheduler.rb index acbdc37..265df86 100644 --- a/lib/multi_db/scheduler.rb +++ b/lib/multi_db/scheduler.rb @@ -5,7 +5,7 @@ class NoMoreItems < Exception; end attr :items delegate :[], :[]=, :to => :items - tlattr_accessor :current_index + tlattr_accessor :current_index, true def initialize(items, blacklist_timeout = 1.minute) @n = items.length diff --git a/lib/multi_db/thread_local_accessors.rb b/lib/multi_db/thread_local_accessors.rb deleted file mode 100644 index 7dcae34..0000000 --- a/lib/multi_db/thread_local_accessors.rb +++ /dev/null @@ -1,32 +0,0 @@ -module MultiDb - module ThreadLocalAccessors - # Creates thread-local accessors for the given attribute name. - # - # The first invokation of the setter will make this value the default - # for any subsequent threads. - def tlattr_accessor(name) - ivar = "@_tlattr_#{name}" - class_eval %Q{ - def #{name} - if #{ivar} - #{ivar}[Thread.current.object_id] - else - nil - end - end - - def #{name}=(val) - if #{ivar} - unless #{ivar}.has_key?(Thread.current.object_id) - ObjectSpace.define_finalizer(Thread.current, lambda {|id| #{ivar}.delete(id) }) - end - #{ivar}[Thread.current.object_id] = val - else - #{ivar} = Hash.new {|h, k| h[k] = val} - val - end - end - }, __FILE__, __LINE__ - end - end -end diff --git a/multi_db.gemspec b/multi_db.gemspec index acf1a53..9ca1e33 100644 --- a/multi_db.gemspec +++ b/multi_db.gemspec @@ -2,15 +2,15 @@ Gem::Specification.new do |s| s.name = %q{multi_db} - s.version = "0.2.0" + s.version = "0.2.1" s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version= s.authors = ["Maximilian Sch\303\266fmann"] - s.date = %q{2009-03-08} + s.date = %q{2009-03-11} s.description = "Connection proxy for ActiveRecord for single master / multiple slave database deployments" s.email = "max@pragmatic-it.de" s.extra_rdoc_files = ["LICENSE", "README.rdoc"] - s.files = ["lib/multi_db.rb", "lib/multi_db/thread_local_accessors.rb", "lib/multi_db/active_record_extensions.rb", "lib/multi_db/connection_proxy.rb", "lib/multi_db/observer_extensions.rb", "lib/multi_db/query_cache_compat.rb", "lib/multi_db/scheduler.rb", "LICENSE", "README.rdoc", "spec/config/database.yml", "spec/connection_proxy_spec.rb", "spec/scheduler_spec.rb", "spec/thread_local_accessors_spec.rb", "spec/spec_helper.rb", "multi_db.gemspec"] + s.files = ["lib/multi_db.rb", "lib/multi_db/active_record_extensions.rb", "lib/multi_db/connection_proxy.rb", "lib/multi_db/observer_extensions.rb", "lib/multi_db/query_cache_compat.rb", "lib/multi_db/scheduler.rb", "LICENSE", "README.rdoc", "spec/config/database.yml", "spec/connection_proxy_spec.rb", "spec/scheduler_spec.rb", "spec/spec_helper.rb", "multi_db.gemspec"] s.has_rdoc = true s.homepage = "http://github.com/schoefmax/multi_db" s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "multi_db", "--main", "README.rdoc"] @@ -24,10 +24,13 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency('activerecord', [">= 2.1.0"]) + s.add_runtime_dependency('schoefmax-tlattr_accessors', [">= 0.0.3"]) else s.add_dependency('activerecord', [">= 2.1.0"]) + s.add_dependency('schoefmax-tlattr_accessors', [">= 0.0.3"]) end else s.add_dependency('activerecord', [">= 2.1.0"]) + s.add_dependency('schoefmax-tlattr_accessors', [">= 0.0.3"]) end end diff --git a/spec/connection_proxy_spec.rb b/spec/connection_proxy_spec.rb index eba5cbb..1e4131e 100644 --- a/spec/connection_proxy_spec.rb +++ b/spec/connection_proxy_spec.rb @@ -2,7 +2,6 @@ require MULTI_DB_SPEC_DIR + '/../lib/multi_db/query_cache_compat' require MULTI_DB_SPEC_DIR + '/../lib/multi_db/active_record_extensions' require MULTI_DB_SPEC_DIR + '/../lib/multi_db/observer_extensions' -require MULTI_DB_SPEC_DIR + '/../lib/multi_db/thread_local_accessors' require MULTI_DB_SPEC_DIR + '/../lib/multi_db/scheduler' require MULTI_DB_SPEC_DIR + '/../lib/multi_db/connection_proxy' diff --git a/spec/scheduler_spec.rb b/spec/scheduler_spec.rb index 205bd1b..56505ce 100644 --- a/spec/scheduler_spec.rb +++ b/spec/scheduler_spec.rb @@ -1,5 +1,4 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper') -require MULTI_DB_SPEC_DIR + '/../lib/multi_db/thread_local_accessors' require MULTI_DB_SPEC_DIR + '/../lib/multi_db/scheduler' describe MultiDb::Scheduler do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 02d8d83..99c0372 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,6 +1,6 @@ require 'rubygems' gem 'activerecord', '2.2.2' -%w[active_record yaml erb spec].each {|lib| require lib} +%w[tlattr_accessors active_record yaml erb spec].each {|lib| require lib} RAILS_ENV = ENV['RAILS_ENV'] = 'test' diff --git a/spec/thread_local_accessors_spec.rb b/spec/thread_local_accessors_spec.rb deleted file mode 100644 index 5a83dee..0000000 --- a/spec/thread_local_accessors_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/spec_helper') -require MULTI_DB_SPEC_DIR + '/../lib/multi_db/thread_local_accessors.rb' - -class Foo - extend MultiDb::ThreadLocalAccessors - tlattr_accessor :bar -end - -describe MultiDb::ThreadLocalAccessors do - - it "should store values local to the thread" do - x = Foo.new - x.bar = 2 - Thread.new do - x.bar.should == 2 - x.bar = 3 - Thread.new do - x.bar.should == 2 - x.bar = 5 - end.join - x.bar.should == 3 - end.join - x.bar.should == 2 - end - - it 'should not leak memory' do - x = Foo.new - n = 6000 - # create many thread-local values to make sure GC is invoked - n.times do - Thread.new do - x.bar = rand - end.join - end - hash = x.send :instance_variable_get, '@_tlattr_bar' - hash.size.should < (n / 2) # it should be a lot lower than n! - end - -end -