module ArJdbc::PostgreSQL::Column::Cast
@note Based on active_record/connection_adapters/postgresql/cast.rb (4.0).
Constants
- ARRAY_ESCAPE
- HstorePair
@private
Public Instance Methods
array_to_string(value, column, adapter)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 533 def array_to_string(value, column, adapter) casted_values = value.map do |val| if String === val if val == "NULL" "\"#{val}\"" else quote_and_escape(adapter.type_cast(val, column, true)) end else adapter.type_cast(val, column, true) end end "{#{casted_values.join(',')}}" end
cidr_to_string(object)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 576 def cidr_to_string(object) if IPAddr === object "#{object.to_s}/#{object.instance_variable_get(:@mask_addr).to_s(2).count('1')}" else object end end
hstore_to_string(object, array_member = false)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 501 def hstore_to_string(object, array_member = false) if Hash === object string = object.map { |k, v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(',') string = escape_hstore(string) if array_member string else object end end
json_to_string(object)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 525 def json_to_string(object) if Hash === object || Array === object ActiveSupport::JSON.encode(object) else object end end
point_to_string(point)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 461 def point_to_string(point) "(#{point[0]},#{point[1]})" end
range_to_string(object)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 548 def range_to_string(object) from = object.begin.respond_to?(:infinite?) && object.begin.infinite? ? '' : object.begin to = object.end.respond_to?(:infinite?) && object.end.infinite? ? '' : object.end "[#{from},#{to}#{object.exclude_end? ? ')' : ']'}" end
string_to_array(string, column_or_oid)
click to toggle source
@note Only used for default values - we get a “parsed” array from JDBC.
# File lib/arjdbc/postgresql/column.rb, line 585 def string_to_array(string, column_or_oid) return string unless String === string parse_pg_array(string).map { |val| type_cast_array(column_or_oid, val) } end
string_to_bit(value)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 485 def string_to_bit(value) case value when /^[01]*$/ then value # Bit-string notation when /^[0-9A-F]*$/i then value.hex.to_s(2) # Hexadecimal notation end end
string_to_cidr(string)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 562 def string_to_cidr(string) if string.nil? nil elsif String === string begin IPAddr.new(string) rescue ArgumentError nil end else string end end
string_to_hstore(string)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 511 def string_to_hstore(string) if string.nil? nil elsif String === string Hash[string.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 string end end
string_to_json(string)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 554 def string_to_json(string) if String === string ActiveSupport::JSON.decode(string) else string end end
string_to_money(string)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 440 def string_to_money(string) return string unless String === string # Because money output is formatted according to the locale, there # are two cases to consider (note the decimal separators) : # (1) $12,345,678.12 # (2) $12.345.678,12 # Negative values are represented as follows: # (3) -$2.55 # (4) ($2.55) string = string.sub(/^\((.+)\)$/, '-\1') # (4) case string when /^-?\D+[\d,]+\.\d{2}$/ # (1) string.gsub!(/[^-\d.]/, '') when /^-?\D+[\d.]+,\d{2}$/ # (2) string.gsub!(/[^-\d,]/, '') string.sub!(/,/, '.') end value_to_decimal string end
string_to_point(string)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 465 def string_to_point(string) if string[0] == '(' && string[-1] == ')' string = string[1...-1] end string.split(',').map { |v| Float(v) } end
string_to_time(string)
click to toggle source
Calls superclass method
# File lib/arjdbc/postgresql/column.rb, line 472 def string_to_time(string) return string unless String === string case string when 'infinity' then 1.0 / 0.0 when '-infinity' then -1.0 / 0.0 when / BC$/ super("-#{string.sub(/ BC$/, "")}") else super end end
Private Instance Methods
escape_hstore(value)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 599 def escape_hstore(value) if value.nil? 'NULL' else if value == "" '""' else '"%s"' % value.to_s.gsub(/(["\])/, '\\\1') end end end
quote_and_escape(value)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 613 def quote_and_escape(value) case value when "NULL", Numeric value else value = value.gsub(/\/, ARRAY_ESCAPE) value.gsub!(/"/,"\\\"") "\"#{value}\"" end end
type_cast_array(oid, value)
click to toggle source
# File lib/arjdbc/postgresql/column.rb, line 624 def type_cast_array(oid, value) if ::Array === value value.map { |item| type_cast_array(oid, item) } else if oid.is_a?(Column) oid.type_cast value, oid.type # column.type else oid.type_cast value end end end