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


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.

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

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.


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.


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