From 4b005fb371c2e7af80df7da63be94509b1db038c Mon Sep 17 00:00:00 2001 From: Aaron Stone Date: Wed, 23 Jan 2013 01:05:23 -0800 Subject: DATABASE_URL parsing should turn numeric strings into numeric types, and the strings true and false into boolean types, in order to match how YAML would parse the same values from database.yml and prevent unexpected type errors in the database adapters. --- .../connection_adapters/connection_specification.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'activerecord/lib/active_record/connection_adapters/connection_specification.rb') diff --git a/activerecord/lib/active_record/connection_adapters/connection_specification.rb b/activerecord/lib/active_record/connection_adapters/connection_specification.rb index 09250d3c01..d7cd34df22 100644 --- a/activerecord/lib/active_record/connection_adapters/connection_specification.rb +++ b/activerecord/lib/active_record/connection_adapters/connection_specification.rb @@ -62,6 +62,10 @@ module ActiveRecord ConnectionSpecification.new(spec, adapter_method) end + # For DATABASE_URL, accept a limited concept of ints and floats + SIMPLE_INT = /^\d+$/ + SIMPLE_FLOAT = /^\d+\.\d+$/ + def connection_url_to_hash(url) # :nodoc: config = URI.parse url adapter = config.scheme @@ -77,6 +81,21 @@ module ActiveRecord spec.map { |key,value| spec[key] = uri_parser.unescape(value) if value.is_a?(String) } if config.query options = Hash[config.query.split("&").map{ |pair| pair.split("=") }].symbolize_keys + # If anything looks numeric, make it numeric (e.g. pool count, timeout values, etc.) + options.map do |key,value| + options[key] = case value + when SIMPLE_INT + value.to_i + when SIMPLE_FLOAT + value.to_f + when 'true' + true + when 'false' + false + else + value + end + end spec.merge!(options) end spec -- cgit v1.2.3