Class: Tarantool::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/tarantool/request.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(space, *args) ⇒ Request

Returns a new instance of Request.



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/tarantool/request.rb', line 37

def initialize(space, *args)
  @space = space      
  @args = args
  @params = if args.last.is_a? Hash
    args.pop
  else
    {}
  end
  @space_no = params.delete(:space_no) || space.space_no || raise(UndefinedSpace.new)
  parse_args
end

Instance Attribute Details

#argsObject (readonly)

Returns the value of attribute args.



35
36
37
# File 'lib/tarantool/request.rb', line 35

def args
  @args
end

#paramsObject (readonly)

Returns the value of attribute params.



35
36
37
# File 'lib/tarantool/request.rb', line 35

def params
  @params
end

#spaceObject (readonly)

Returns the value of attribute space.



35
36
37
# File 'lib/tarantool/request.rb', line 35

def space
  @space
end

#space_noObject (readonly)

Returns the value of attribute space_no.



36
37
38
# File 'lib/tarantool/request.rb', line 36

def space_no
  @space_no
end

Class Method Details

.pack_field(value) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/tarantool/request.rb', line 17

def pack_field(value)
  if String === value
    raise StringTooLong.new if value.bytesize > 1024 * 1024
    [value.bytesize, value].pack('wa*')
  elsif Integer === value
    if value < 4294967296 # 2 ^ 32
      [4, value].pack('wL')
    else
      [8, value].pack('wQ')
    end
  elsif value.is_a?(Tarantool::Field)
    [value.data.bytesize].pack('w') + value.data
  else
    raise ArgumentError.new("Field should be integer or string")
  end
end

.pack_tuple(*values) ⇒ Object



13
14
15
# File 'lib/tarantool/request.rb', line 13

def pack_tuple(*values)
  [values.size].pack('L') + values.map { |v| pack_field(v) }.join
end

.request_type(name = nil) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/tarantool/request.rb', line 5

def request_type(name = nil)
  if name
    @request_type = Tarantool::Requests::REQUEST_TYPES[name] || raise(UndefinedRequestType)
  else
    @request_type
  end
end

Instance Method Details

#connectionObject



83
84
85
# File 'lib/tarantool/request.rb', line 83

def connection
  space.connection
end

#make_packet(body) ⇒ Object



62
63
64
65
# File 'lib/tarantool/request.rb', line 62

def make_packet(body)
  [self.class.request_type, body.size, request_id].pack('LLL') +
  body
end

#make_response(data) ⇒ Object



67
68
69
70
71
72
73
74
75
# File 'lib/tarantool/request.rb', line 67

def make_response(data)
  return_code,  = data[0,4].unpack('L')
  if return_code == 0
    Response.new(data[4, data.size], response_params)
  else
    msg = data[4, data.size].unpack('A*')
    raise BadReturnCode.new("Error code #{return_code}: #{msg}")
  end
end

#parse_argsObject



54
55
56
# File 'lib/tarantool/request.rb', line 54

def parse_args
  
end

#performObject



49
50
51
52
# File 'lib/tarantool/request.rb', line 49

def perform
  data = connection.send_packet request_id, make_packet(make_body)
  make_response data
end

#request_idObject



58
59
60
# File 'lib/tarantool/request.rb', line 58

def request_id
  @request_id ||= connection.next_request_id
end

#response_paramsObject



77
78
79
80
81
# File 'lib/tarantool/request.rb', line 77

def response_params
  res = {}
  res[:return_tuple] = true if params[:return_tuple]
  res
end