Ensure that cache-control headers are merged

There are several aspects to this commit, that don't well fit into broken down
commits, so they are detailed here:

 * When a user uses response.headers['Cache-Control'] = some_value, then the
   documented convention in ConditionalGet is not adhered to, in this case,
   response.cache_control is ignored due to `return if
   self[CACHE_CONTROL].present?`
 * When a middleware sets cache-control headers that would clobber, they're
   converted to symbols directly, without underscores. This would lead to bugs.
 * Items that would live in :extras if set through expires_in, are placed
   directly in the @cache_control hash, and not respected in many cases
   (somewhat adhering to the aforementioned documentation).
 * Although quite useless, any directive named 'extras' would be ignored.

The general convention applied is that expires_* take precedence, but no longer
overwrite everything and expires_* are ALWAYS applied, even if the header is
set.

I am still unhappy about the contents of this commit, and the code in general.
Ideally it should be refactored to no longer use :extras. I'd likely recommend
expanding @cache_control into a class, and giving it the power to handle the
merge in a more efficient fashion. Such a commit would be a larger change that
could have additional semantic changes for other libraries unless they utilize
expires_in in very standard ways.
Make DatabaseTasks a module with real private methods
Refactor Relation#update a bit to avoid an extra Enumerator instance
Fix lookup on HashWithIndifferentAccess for array values.
Use map! instead of replace + map
Merge branch 'hash_with_indifferent_access_fix'

The problem:
Accessing a HashWithIndifferentAccess does not return the the same object
that is stored in the hash (i.e. equal?) causing unexpected results:

    hash = HashWithIndifferentAccess.new {|h, k| h[k] = []}
    hash[:a] << 1  # => [1]
    hash[:a]       # => [], expected [1]

The cause:
When a block is provided to generate default values the generated values
are duped if they are arrays. The duped value is stored in the hash but
the original value is returned when the hash is accessed.

The fix:
The duping is there for allowing frozen arrays containing hashes to be
modified. The fix restricts the duping to this case. Note that if default
function generates a frozen array an error will be raised on assignment
before and after the patch.

Closes #3811
Improve the CHANGELOG entry [ci skip]
Remember the stored attributes in a config attribute.

This allows you to retrieve the list of attributes you've defined.
Usable for e.g. selects in the view, or interators based on the
attributes you wish to store in the serialized column.
Refactor and use class_attribute
Merge pull request #5412 from tilsammans/stored_attributes

Added `stored_attributes` hash which contains the attributes stored using
ActiveRecord::Store. This allows you to retrieve the list of attributes
you've defined.

    class User < ActiveRecord::Base
      store :settings, accessors: [:color, :homepage]
    end

    User.stored_attributes[:settings] # [:color, :homepage]
Validates_numericality_of is skipped when changing 0 to to non-empty string

This happens when A has_many many B and A accepts_nested_attributes B that has a numeric colum
with initial 0 value. So a.update_attributes({:b_attributes => { :id => b.id, :numeric => 'foo' }})
passes the validation test but, the value of :numeric doesn't change.
his commit forces that the update fails with the above conditions.

Fixes #6393
Fixes #2331
Refactor the conditionals
Merge branch 'acapilleri-update_nested_attributes'

Closes #6675
Added test for case when view doesn't have logger method when using ActionController::Metal controller.
Merge pull request #6776 from raggi/cache_control

Ensure that cache-control headers are merged
Merge pull request #6777 from route/logger_in_metal_tests

Added test for case when view doesn't have logger method when using 
ActionController::Metal controller.
Refactor db:charset task

In a similar vein to Pat's work on create, drop etc, the db:charset
task is now a one liner in databases.rake
Merge pull request #6779 from simonjefford/db-rake-charset

Refactor db:charset task
Remove extra test case.
Make the test description better reflect what is happening