class Monga::Request

Constants

FLAGS
OP_CODES

Attributes

connection[R]
request_id[R]

Public Class Methods

new(connection, db_name, collection_name, options = {}) click to toggle source
# File lib/monga/request.rb, line 18
def initialize(connection, db_name, collection_name, options = {})
  @connection = connection
  @db_name = db_name
  @collection_name = collection_name
  @options = options

  check_flags
  @request_id = self.class.request_id
end

Private Class Methods

op_name(op = nil) click to toggle source
# File lib/monga/request.rb, line 110
def self.op_name(op = nil)
  op ? @op_name = op : @op_name
end
request_id() click to toggle source
# File lib/monga/request.rb, line 103
def self.request_id
  @@request_id ||= 0
  @@request_id += 1
  @@request_id >= 2**32 ? @@request_id = 1 : @@request_id
  @@request_id
end

Public Instance Methods

callback_perform() { |err, resp| ... } click to toggle source

Fire and wait

# File lib/monga/request.rb, line 43
def callback_perform
  @connection.send_command(command, @request_id) do |data|
    err, resp = parse_response(data)
    if block_given?
      yield(err, resp)
    else
      err ? raise(err) : resp
    end
  end
end
command() click to toggle source
# File lib/monga/request.rb, line 28
def command
  header + body
end
header() click to toggle source
# File lib/monga/request.rb, line 32
def header
  ::BinUtils.append_int32_le!(nil, command_length, @request_id, 0, op_code)
end
parse_response(data) click to toggle source
# File lib/monga/request.rb, line 54
def parse_response(data)
  if Exception === data
    [data, nil]
  else
    flags = data[4]
    docs = data.last
    if flags & 2**0 > 0
      Monga::Exceptions::CursorNotFound.new(docs.first)
    elsif flags & 2**1 > 0
      Monga::Exceptions::QueryFailure.new(docs.first)
    elsif docs.first && (docs.first["err"] || docs.first["errmsg"])
      Monga::Exceptions::QueryFailure.new(docs.first)
    else
      [nil, data]
    end
  end
end
perform() click to toggle source

Fire and Forget

# File lib/monga/request.rb, line 37
def perform
  @connection.send_command(command, @request_id)
  self
end

Private Instance Methods

check_flags() click to toggle source

Ouch!

# File lib/monga/request.rb, line 75
def check_flags
  return  unless @options[:query]
  self.class::FLAGS.each do |k, byte|
    v = @options[:query].delete(k)
    @options[k] = v  if v
  end
end
command_length() click to toggle source
# File lib/monga/request.rb, line 99
def command_length
  Monga::HEADER_SIZE + body.size
end
flags() click to toggle source
# File lib/monga/request.rb, line 83
def flags
  flags = 0
  self.class::FLAGS.each do |k, byte|
    flags = flags | 1 << byte if @options[k]
  end
  flags
end
full_name() click to toggle source
# File lib/monga/request.rb, line 91
def full_name
  [@db_name, @collection_name] * "."
end
op_code() click to toggle source
# File lib/monga/request.rb, line 95
def op_code
  OP_CODES[self.class.op_name]
end