Class: Riak::Client::BeefcakeProtobuffsBackend::Protocol

Inherits:
Object
  • Object
show all
Includes:
Util::Translation
Defined in:
lib/riak/client/beefcake/protocol.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Util::Translation

#i18n_scope, #t

Constructor Details

#initialize(socket) ⇒ Protocol

Returns a new instance of Protocol


13
14
15
# File 'lib/riak/client/beefcake/protocol.rb', line 13

def initialize(socket)
  @socket = socket
end

Instance Attribute Details

#socketObject (readonly)

Returns the value of attribute socket


11
12
13
# File 'lib/riak/client/beefcake/protocol.rb', line 11

def socket
  @socket
end

Instance Method Details

#expect(code, decoder_class = nil, options = { }) ⇒ Beefcake::Message, :empty

Receives a Riak-formatted message, checks the symbolic name against the given code, decodes it if it matches, and can optionally return success if the payload is empty.

Parameters:

  • code (Symbol)

    the code for the message

  • decoder_class (Class, nil) (defaults to: nil)

    the class to attempt to decode the payload with

  • options (Hash) (defaults to: { })

Options Hash (options):

  • :empty_body_acceptable (Boolean)

    Whether to accept an empty body and not attempt decoding. In this case, this method will return the symbol `:empty` instead of a `Beefcake::Message` instance

Returns:

  • (Beefcake::Message, :empty)

Raises:


74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/riak/client/beefcake/protocol.rb', line 74

def expect(code, decoder_class = nil, options = { })
  code = BeefcakeMessageCodes[code] unless code.is_a? Symbol
  name, body = receive

  if name == :ErrorResp
    raise ProtobuffsErrorResponse.new RpbErrorResp.decode(body)
  end

  if name != code
    raise ProtobuffsUnexpectedResponse.new name, code
  end

  return true if decoder_class.nil?

  return :empty if body.nil? && options[:empty_body_acceptable]

  return decoder_class.decode body
end

#receiveArray<Symbol, String>

Receives a Riak-formatted message, and returns the symbolic name of the message along with the string payload from the network.

Returns:

Raises:


43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/riak/client/beefcake/protocol.rb', line 43

def receive
  header = socket.read 5

  raise ProtobuffsFailedHeader.new if header.nil?
  message_length, code = header.unpack 'NC'
  body_length = message_length - 1
  body = nil
  body = socket.read body_length if body_length > 0

  name = BeefcakeMessageCodes[code]

  return name, body
end

#write(code, message = nil) ⇒ Object

Encodes and writes a Riak-formatted message, including protocol buffer payload if given.

Parameters:

  • code (Symbol, Integer)

    the symbolic or numeric code for the message

  • message (Beefcake::Message, nil) (defaults to: nil)

    the protocol buffer message payload, or nil if the message carries no payload


24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/riak/client/beefcake/protocol.rb', line 24

def write(code, message = nil)
  if code.is_a? Symbol
    code = BeefcakeMessageCodes.index code
  end

  serialized = serialize message

  header = [serialized.length + 1, code].pack 'NC'

  payload = header + serialized

  socket.write payload
  socket.flush
end