class ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Hstore
:nodoc:
:nodoc:
def accessor
def accessor ActiveRecord::Store::StringKeyedHashAccessor end
def changed_in_place?(raw_old_value, new_value)
the keys change between the two hashes, and they would not be marked
By comparing hashes, this avoids an edge case where the order of
Will compare the Hash equivalents of +raw_old_value+ and +new_value+.
def changed_in_place?(raw_old_value, new_value) deserialize(raw_old_value) != new_value end
def deserialize(value)
def deserialize(value) return value unless value.is_a?(::String) scanner = StringScanner.new(value) hash = {} until scanner.eos? unless scanner.skip(/"/) raise(ArgumentError, ERROR % scanner.string.inspect) end unless key = scanner.scan(/^(\\[\\"]|[^\\"])*?(?=")/) raise(ArgumentError, ERROR % scanner.string.inspect) end unless scanner.skip(/"=>?/) raise(ArgumentError, ERROR % scanner.string.inspect) end if scanner.scan(/NULL/) value = nil else unless scanner.skip(/"/) raise(ArgumentError, ERROR % scanner.string.inspect) end unless value = scanner.scan(/^(\\[\\"]|[^\\"])*?(?=")/) raise(ArgumentError, ERROR % scanner.string.inspect) end unless scanner.skip(/"/) raise(ArgumentError, ERROR % scanner.string.inspect) end end key.gsub!('\"', '"') key.gsub!("\\\\", "\\") if value value.gsub!('\"', '"') value.gsub!("\\\\", "\\") end hash[key] = value unless scanner.skip(/, /) || scanner.eos? raise(ArgumentError, ERROR % scanner.string.inspect) end end hash end
def escape_hstore(value)
def escape_hstore(value) if value.nil? "NULL" else if value == "" '""' else '"%s"' % value.to_s.gsub(/(["\\])/, '\\\\\1') end end end
def serialize(value)
def serialize(value) if value.is_a?(::Hash) value.map { |k, v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(", ") elsif value.respond_to?(:to_unsafe_h) serialize(value.to_unsafe_h) else value end end
def type
def type :hstore end