Class: Sequel::Postgres::PGRow::Splitter

Inherits:
StringScanner
  • Object
show all
Defined in:
lib/sequel/extensions/pg_row.rb

Overview

This parser-like class splits the PostgreSQL row-valued/composite type output string format into an array of strings. Note this class makes no attempt to handle all input formats that PostgreSQL will accept, it only handles the output format that PostgreSQL uses.

Constant Summary collapse

OPEN_PAREN =
/\(/.freeze
CLOSE_PAREN =
/\)/.freeze
UNQUOTED_RE =
/[^,)]*/.freeze
SEP_RE =
/[,)]/.freeze
QUOTE_RE =
/"/.freeze
QUOTE_SEP_RE =
/"[,)]/.freeze
QUOTED_RE =
/(\\.|""|[^"])*/.freeze
REPLACE_RE =
/\\(.)|"(")/.freeze
REPLACE_WITH =
'\1\2'.freeze

Instance Method Summary collapse

Instance Method Details

#parseObject

Split the stored string into an array of strings, handling the different types of quoting.



213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/sequel/extensions/pg_row.rb', line 213

def parse
  return @result if @result
  values = []
  skip(OPEN_PAREN)
  if skip(CLOSE_PAREN)
    values << nil
  else
    until eos?
      if skip(QUOTE_RE)
        values << scan(QUOTED_RE).gsub(REPLACE_RE, REPLACE_WITH)
        skip(QUOTE_SEP_RE)
      else
        v = scan(UNQUOTED_RE)
        values << (v unless v.empty?)
        skip(SEP_RE)
      end
    end
  end
  values
end