class PgArray
Public Class Methods
new(pg_array_string)
click to toggle source
# File lib/pg_array/pg_array.rb, line 2 def initialize(pg_array_string) @pg_array_string = pg_array_string end
Public Instance Methods
to_a()
click to toggle source
# File lib/pg_array/pg_array.rb, line 6 def to_a @to_a ||= begin if @pg_array_string.nil? nil else parse_array(@pg_array_string) end end end
Private Instance Methods
new_element(elem)
click to toggle source
# File lib/pg_array/pg_array.rb, line 103 def new_element(elem) if elem.is_a?(Array) elem else if elem == 'NULL' nil else elem.sub(/^"/, '').sub(/"$/, '') end end end
parse_array(str)
click to toggle source
Based on ruby-dbi implementation DBI::DBD::Pg::Type::Array#convert_array ruby-dbi.rubyforge.org/
# File lib/pg_array/pg_array.rb, line 22 def parse_array(str) array_nesting = 0 in_string = false escaped = false sbuffer = '' result_array = [] str.each_byte do |char| char = char.chr if escaped sbuffer += char escaped = false next end case char when '{' if in_string sbuffer += char next end if array_nesting >= 1 sbuffer += char end array_nesting += 1 when '"' sbuffer += char in_string = !in_string when "\\" if array_nesting > 1 sbuffer += char else escaped = true end when ',' if in_string or array_nesting > 1 sbuffer += char else result_array << new_element(sbuffer) sbuffer = '' end when '}' if in_string sbuffer += char next end array_nesting -=1 if array_nesting == 1 sbuffer += char sbuffer = parse_array(sbuffer) elsif array_nesting > 1 sbuffer += char else unless sbuffer.nil? result_array << new_element(sbuffer) end end else sbuffer += char end end result_array end