class Sequel::Postgres::PGRow::Parser
The Parser
is responsible for taking the input string from PostgreSQL, and returning an appropriate ruby object that the type represents, such as an ArrayRow
or HashRow
.
Attributes
Converters for each member in the composite type. If not present, no conversion will be done, so values will remain strings. If present, should be an array of callable objects.
The OIDs for each member in the composite type. Not currently used, but made available for user code.
The columns for the parser, if any. If the parser has no columns, it will treat the input as an array. If it has columns, it will treat the input as a hash. If present, should be an array of strings.
The oid for the composite type itself.
A callable object used for typecasting the object. This is similar to the converter, but it is called by the typecasting code, which has different assumptions than the converter. For instance, the converter should be called with all of the member values already typecast, but the typecaster may not be.
Public Class Methods
Source
# File lib/sequel/extensions/pg_row.rb 304 def initialize(h=OPTS) 305 @columns = h[:columns] 306 @column_converters = h[:column_converters] 307 @column_oids = h[:column_oids] 308 @converter = h[:converter] 309 @typecaster = h[:typecaster] 310 @oid = h[:oid] 311 end
Sets each of the parser’s attributes, using options with the same name (e.g. :columns sets the columns attribute).
Public Instance Methods
Source
# File lib/sequel/extensions/pg_row.rb 315 def call(s) 316 convert(convert_format(convert_columns(Splitter.new(s).parse))) 317 end
Convert the PostgreSQL composite type input format into an appropriate ruby object.
Source
# File lib/sequel/extensions/pg_row.rb 323 def typecast(obj) 324 case obj 325 when Array 326 _typecast(convert_format(obj)) 327 when Hash 328 unless @columns 329 raise Error, 'PGRow::Parser without columns cannot typecast from a hash' 330 end 331 _typecast(obj) 332 else 333 raise Error, 'PGRow::Parser can only typecast arrays and hashes' 334 end 335 end
Typecast the given object to the appropriate type using the typecaster. Note that this does not conversion for the members of the composite type, since those conversion expect strings and strings may not be provided.
Private Instance Methods
Source
# File lib/sequel/extensions/pg_row.rb 341 def _typecast(obj) 342 if t = @typecaster 343 t.call(obj) 344 else 345 obj 346 end 347 end
If the parser has a typecaster, call it with the object, otherwise return the object as is.
Source
# File lib/sequel/extensions/pg_row.rb 374 def convert(obj) 375 if c = @converter 376 c.call(obj) 377 else 378 obj 379 end 380 end
If the parser has a converter, call it with the object, otherwise return the object as is.
Source
# File lib/sequel/extensions/pg_row.rb 352 def convert_columns(arr) 353 if ccs = @column_converters 354 arr.zip(ccs).map{|v, pr| (v && pr) ? pr.call(v) : v} 355 else 356 arr 357 end 358 end
If the parser has column converters, map the array of strings input to a array of appropriate ruby objects, one for each converter.
Source
# File lib/sequel/extensions/pg_row.rb 362 def convert_format(arr) 363 if cs = @columns 364 h = {} 365 arr.zip(cs).each{|v, c| h[c] = v} 366 h 367 else 368 arr 369 end 370 end
If the parser has columns, return a hash assuming that the array is ordered by the columns.