diff options
author | kennyj <kennyj@gmail.com> | 2012-03-01 01:19:27 +0900 |
---|---|---|
committer | kennyj <kennyj@gmail.com> | 2012-03-01 01:19:27 +0900 |
commit | 5cbba30a1292dde9c83ab42287c2a1f38f3fcc44 (patch) | |
tree | a016ec1cf6dd9d90e449b8be7a06b6fdd70ee5cb | |
parent | 0da12df2608969330bd47c543866f79ff8ca9edd (diff) | |
download | rails-5cbba30a1292dde9c83ab42287c2a1f38f3fcc44.tar.gz rails-5cbba30a1292dde9c83ab42287c2a1f38f3fcc44.tar.bz2 rails-5cbba30a1292dde9c83ab42287c2a1f38f3fcc44.zip |
Support judgement expired schema cache dump.
3 files changed, 25 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/schema_cache.rb b/activerecord/lib/active_record/connection_adapters/schema_cache.rb index 53fa404305..aad1f9a7ef 100644 --- a/activerecord/lib/active_record/connection_adapters/schema_cache.rb +++ b/activerecord/lib/active_record/connection_adapters/schema_cache.rb @@ -1,7 +1,7 @@ module ActiveRecord module ConnectionAdapters class SchemaCache - attr_reader :columns, :columns_hash, :primary_keys, :tables + attr_reader :columns, :columns_hash, :primary_keys, :tables, :version attr_accessor :connection def initialize(conn) @@ -36,6 +36,7 @@ module ActiveRecord @columns_hash.clear @primary_keys.clear @tables.clear + @version = nil end # Clear out internal caches for table with +table_name+. @@ -47,13 +48,15 @@ module ActiveRecord end def marshal_dump - [:@columns, :@columns_hash, :@primary_keys, :@tables].map do |val| + # if we get current version during initialization, it happens stack over flow. + @version = ActiveRecord::Migrator.current_version + [@version] + [:@columns, :@columns_hash, :@primary_keys, :@tables].map do |val| self.instance_variable_get(val).inject({}) { |h, v| h[v[0]] = v[1]; h } end end def marshal_load(array) - @columns, @columns_hash, @primary_keys, @tables = array + @version, @columns, @columns_hash, @primary_keys, @tables = array prepare_default_proc end diff --git a/activerecord/lib/active_record/railtie.rb b/activerecord/lib/active_record/railtie.rb index c287356a7b..516c450f85 100644 --- a/activerecord/lib/active_record/railtie.rb +++ b/activerecord/lib/active_record/railtie.rb @@ -121,7 +121,11 @@ module ActiveRecord filename = File.join(app.config.paths["db"].first, "schema_cache.dump") if File.file?(filename) cache = Marshal.load(open(filename, 'rb') { |f| f.read }) - ActiveRecord::Base.connection.schema_cache = cache + if cache.version == ActiveRecord::Migrator.current_version + ActiveRecord::Base.connection.schema_cache = cache + else + warn "schema_cache.dump is expired. Current version is #{ActiveRecord::Migrator.current_version}, but cache version is #{cache.version}." + end end end end diff --git a/railties/test/application/initializers/frameworks_test.rb b/railties/test/application/initializers/frameworks_test.rb index d8012eed64..a0e88cd0f0 100644 --- a/railties/test/application/initializers/frameworks_test.rb +++ b/railties/test/application/initializers/frameworks_test.rb @@ -205,5 +205,19 @@ module ApplicationTests assert ActiveRecord::Base.connection.schema_cache.tables["posts"] end + test "expire schema cache dump" do + Dir.chdir(app_path) do + `rails generate model post title:string` + `bundle exec rake db:migrate` + `bundle exec rake db:schema:cache:dump` + + `bundle exec rake db:rollback` + end + silence_warnings { + require "#{app_path}/config/environment" + assert !ActiveRecord::Base.connection.schema_cache.tables["posts"] + } + end + end end |