Sha256: 5693bca2576b298bb78d8d1caaf50e9fe8be65a4c5812bb9e6f403203f910ee6
Contents?: true
Size: 1.55 KB
Versions: 52
Compression:
Stored size: 1.55 KB
Contents
module ActiveRecord module ConnectionAdapters module PostgreSQL module OID # :nodoc: class Hstore < Type::Value # :nodoc: include Type::Mutable def type :hstore end def type_cast_from_database(value) if value.is_a?(::String) ::Hash[value.scan(HstorePair).map { |k, v| v = v.upcase == 'NULL' ? nil : v.gsub(/\A"(.*)"\Z/m,'\1').gsub(/\\(.)/, '\1') k = k.gsub(/\A"(.*)"\Z/m,'\1').gsub(/\\(.)/, '\1') [k, v] }] else value end end def type_cast_for_database(value) if value.is_a?(::Hash) value.map { |k, v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(', ') else value end end def accessor ActiveRecord::Store::StringKeyedHashAccessor end private HstorePair = begin quoted_string = /"[^"\\]*(?:\\.[^"\\]*)*"/ unquoted_string = /(?:\\.|[^\s,])[^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/ /(#{quoted_string}|#{unquoted_string})\s*=>\s*(#{quoted_string}|#{unquoted_string})/ end def escape_hstore(value) if value.nil? 'NULL' else if value == "" '""' else '"%s"' % value.to_s.gsub(/(["\\])/, '\\\\\1') end end end end end end end end
Version data entries
52 entries across 51 versions & 8 rubygems