Module: ArJdbc::PostgreSQL::Column::Cast
- Defined in:
- lib/arjdbc/postgresql/column.rb
Overview
Note:
Based on active_record/connection_adapters/postgresql/cast.rb (4.0).
Instance Method Summary collapse
- #array_to_string(value, column, adapter, should_be_quoted = false) ⇒ Object
- #cidr_to_string(object) ⇒ Object
- #hstore_to_string(object) ⇒ Object
- #json_to_string(object) ⇒ Object
- #point_to_string(point) ⇒ Object
- #range_to_string(object) ⇒ Object
- #string_to_array(string, column) ⇒ Object
- #string_to_bit(value) ⇒ Object
- #string_to_cidr(string) ⇒ Object
- #string_to_hstore(string) ⇒ Object
- #string_to_json(string) ⇒ Object
- #string_to_money(string) ⇒ Object
- #string_to_point(string) ⇒ Object
- #string_to_time(string) ⇒ Object
Instance Method Details
#array_to_string(value, column, adapter, should_be_quoted = false) ⇒ Object
409 410 411 412 413 414 415 416 417 418 419 420 421 422 |
# File 'lib/arjdbc/postgresql/column.rb', line 409 def array_to_string(value, column, adapter, should_be_quoted = false) 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) ⇒ Object
448 449 450 451 452 453 454 |
# File 'lib/arjdbc/postgresql/column.rb', line 448 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) ⇒ Object
379 380 381 382 383 384 385 |
# File 'lib/arjdbc/postgresql/column.rb', line 379 def hstore_to_string(object) if Hash === object object.map { |k,v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(',') else object end end |
#json_to_string(object) ⇒ Object
401 402 403 404 405 406 407 |
# File 'lib/arjdbc/postgresql/column.rb', line 401 def json_to_string(object) if Hash === object || Array === object ActiveSupport::JSON.encode(object) else object end end |
#point_to_string(point) ⇒ Object
339 340 341 |
# File 'lib/arjdbc/postgresql/column.rb', line 339 def point_to_string(point) "(#{point[0]},#{point[1]})" end |
#range_to_string(object) ⇒ Object
424 425 426 427 428 |
# File 'lib/arjdbc/postgresql/column.rb', line 424 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) ⇒ Object
Note:
Only used for default values - we get a "parsed" array from JDBC.
457 458 459 460 |
# File 'lib/arjdbc/postgresql/column.rb', line 457 def string_to_array(string, column) return string unless String === string parse_pg_array(string).map { |val| column.type_cast(val, column.type) } end |
#string_to_bit(value) ⇒ Object
363 364 365 366 367 368 |
# File 'lib/arjdbc/postgresql/column.rb', line 363 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) ⇒ Object
438 439 440 441 442 443 444 445 446 |
# File 'lib/arjdbc/postgresql/column.rb', line 438 def string_to_cidr(string) if string.nil? nil elsif String === string IPAddr.new(string) else string end end |
#string_to_hstore(string) ⇒ Object
387 388 389 390 391 392 393 394 395 396 397 398 399 |
# File 'lib/arjdbc/postgresql/column.rb', line 387 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(/^"(.*)"$/,'\1').gsub(/\\(.)/, '\1') k = k.gsub(/^"(.*)"$/,'\1').gsub(/\\(.)/, '\1') [k,v] }] else string end end |
#string_to_json(string) ⇒ Object
430 431 432 433 434 435 436 |
# File 'lib/arjdbc/postgresql/column.rb', line 430 def string_to_json(string) if String === string ActiveSupport::JSON.decode(string) else string end end |
#string_to_money(string) ⇒ Object
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 |
# File 'lib/arjdbc/postgresql/column.rb', line 318 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) ⇒ Object
343 344 345 346 347 348 |
# File 'lib/arjdbc/postgresql/column.rb', line 343 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) ⇒ Object
350 351 352 353 354 355 356 357 358 359 360 361 |
# File 'lib/arjdbc/postgresql/column.rb', line 350 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 |