class PixiClient::ResponseParser

Constants

SQL_ROWSET1_SCHEMA_NS

Attributes

response_body[RW]
rows[RW]
sql_messages[RW]

Public Class Methods

new(response_body) click to toggle source
# File lib/pixi_client/response_parser.rb, line 9
def initialize(response_body)
  self.response_body = response_body
  self.rows = []
  self.sql_messages = []
end

Public Instance Methods

parse!() click to toggle source
# File lib/pixi_client/response_parser.rb, line 15
def parse!
  parse_sql_messages
  parse_rowset
end

Private Instance Methods

identity(value) click to toggle source
# File lib/pixi_client/response_parser.rb, line 119
def identity(value)
  value
end
parse_row(row) click to toggle source
# File lib/pixi_client/response_parser.rb, line 62
def parse_row(row)
  OpenStruct.new.tap do |parsed_row|
    rowset_schema.each do |conversion|
      attr_name = conversion[:name].to_sym
      converted_value = send(conversion[:method], row[attr_name])
      parsed_row.send(:"#{attr_name}=", converted_value)
    end
  end
end
parse_rowset() click to toggle source
# File lib/pixi_client/response_parser.rb, line 46
def parse_rowset
  unparsed_rows.each do |unparsed_row|
    self.rows << parse_row(unparsed_row)
  end
end
parse_sql_message(unparsed_message) click to toggle source
# File lib/pixi_client/response_parser.rb, line 37
def parse_sql_message(unparsed_message)
  OpenStruct.new.tap do |parsed_message|
    parsed_message.message_class = unparsed_message[:class]
    [:line_number, :message, :number, :procedure, :server, :source, :state].each do |attr|
      parsed_message.send(:"#{attr}=", unparsed_message[attr])
    end
  end
end
parse_sql_messages() click to toggle source
# File lib/pixi_client/response_parser.rb, line 22
def parse_sql_messages
  unparsed_messages.each do |unparsed_message|
    self.sql_messages << parse_sql_message(unparsed_message)
  end
end
rowset_schema() click to toggle source
# File lib/pixi_client/response_parser.rb, line 72
def rowset_schema
  if @rowset_schema.nil?
    schemas = response_body[:sql_row_set][:schema]
    schemas = [schemas] unless schemas.is_a?(Array)
    @rowset_schema = schemas.find { |schema| schema[:@target_namespace] == SQL_ROWSET1_SCHEMA_NS } || fail('Impossible to process response body: any schema definition found!')
    @rowset_schema = rowset_schema_to_conversion_hash(@rowset_schema)
  end

  @rowset_schema
end
rowset_schema_to_conversion_hash(schema) click to toggle source
# File lib/pixi_client/response_parser.rb, line 83
def rowset_schema_to_conversion_hash(schema)
  field_list = schema[:element][:complex_type][:sequence][:element][:complex_type][:sequence][:element]
  field_list = [field_list] unless field_list.is_a?(Array)
  field_list.reduce([]) do |memo, field|
    conversion = {}
    conversion[:name] = underscore(field[:@name])

    if field[:@type]
      conversion[:method] = schema_type_to_conversion_method(field[:@type])
    else
      conversion[:method] = schema_type_to_conversion_method(field[:simple_type][:restriction][:@base])
    end

    memo << conversion
  end
end
schema_type_to_conversion_method(schema_type) click to toggle source
# File lib/pixi_client/response_parser.rb, line 100
def schema_type_to_conversion_method(schema_type)
  case(schema_type)
  when 'sqltypes:int' then :to_integer
  when 'sqltypes:datetime' then :to_time
  when 'sqltypes:bit' then :to_boolean
  when 'sqltypes:varchar' then :identity
  else :identity
  end
end
to_boolean(value) click to toggle source
# File lib/pixi_client/response_parser.rb, line 127
def to_boolean(value)
  value.to_i == 1
end
to_integer(value) click to toggle source
# File lib/pixi_client/response_parser.rb, line 123
def to_integer(value)
  value.to_i
end
to_time(value) click to toggle source
# File lib/pixi_client/response_parser.rb, line 131
def to_time(value)
  return '' if value.nil?

  Time.parse(value.to_s)
end
underscore(word) click to toggle source

Extract from Rails ActiveSupport::Inflector

# File lib/pixi_client/response_parser.rb, line 111
def underscore(word)
  word.gsub(/::/, '/').
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
  tr("-", "_").
  downcase
end
unparsed_messages() click to toggle source
# File lib/pixi_client/response_parser.rb, line 28
def unparsed_messages
  unless @unparsed_messages
    @unparsed_messages = response_body[:sql_message] || []
    @unparsed_messages = [@unparsed_messages] unless @unparsed_messages.is_a?(Array)
  end

  @unparsed_messages
end
unparsed_rows() click to toggle source
# File lib/pixi_client/response_parser.rb, line 52
def unparsed_rows
  return [] if response_body[:sql_row_set].nil?
  return [] if response_body[:sql_row_set][:diffgram].nil?
  return [] if response_body[:sql_row_set][:diffgram][:sql_row_set1].nil?

  rowset = response_body[:sql_row_set][:diffgram][:sql_row_set1][:row]

  rowset.is_a?(Array) && rowset || [rowset]
end