Class: Ignite::Request

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

Constant Summary collapse

MIN_LONG =

-2**63

-9223372036854775808 # -2**63
MAX_LONG =

2**63-1

9223372036854775807

Instance Method Summary collapse

Constructor Details

#initialize(op_code) ⇒ Request

Returns a new instance of Request.



6
7
8
9
10
11
12
13
14
15
16
# File 'lib/ignite/request.rb', line 6

def initialize(op_code)
  @format = String.new
  @values = []

  int 0 # length placeholder

  if op_code != OP_HANDSHAKE
    short op_code
    long rand(MIN_LONG..MAX_LONG) # request id
  end
end

Instance Method Details

#array(type_code, value, pack) ⇒ Object



112
113
114
115
116
117
# File 'lib/ignite/request.rb', line 112

def array(type_code, value, pack)
  byte type_code
  int value.size
  @format << "#{pack}#{value.size}"
  @values.concat(value)
end

#array_object(value) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/ignite/request.rb', line 99

def array_object(value)
  # empty arrays take first path for now
  if value.all? { |v| v.is_a?(Integer) }
    array(TYPE_LONG_ARRAY, value, PACK_LONG)
  elsif value.all? { |v| v.is_a?(Float) }
    array(TYPE_DOUBLE_ARRAY, value, PACK_DOUBLE)
  elsif value.all? { |v| v == true || v == false }
    array(TYPE_BOOL_ARRAY, value.map { |v| v ? 1 : 0 }, PACK_CHAR)
  else
    raise Error, "Unable to cache array of #{value.map { |v| v.class.name }.uniq.join(", ")}"
  end
end

#bool(value) ⇒ Object



28
29
30
# File 'lib/ignite/request.rb', line 28

def bool(value)
  byte(value ? 1 : 0)
end

#byte(value) ⇒ Object



32
33
34
35
# File 'lib/ignite/request.rb', line 32

def byte(value)
  @format << PACK_BYTE
  @values << value
end

#data_object(value) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/ignite/request.rb', line 69

def data_object(value)
  case value
  when Integer
    byte TYPE_LONG
    long value
  when Float
    byte TYPE_DOUBLE
    double value
  when TrueClass, FalseClass
    byte TYPE_BOOL
    bool value
  when String
    string value
  when Date
    byte TYPE_DATE
    time = value.to_time
    long(time.to_i * 1000 + (time.nsec / 1000000))
  when Array
    array_object(value)
  when Time
    byte TYPE_TIMESTAMP
    long(value.to_i * 1000 + (value.nsec / 1000000))
    int value.nsec % 1000000
  when NilClass
    byte TYPE_NULL
  else
    raise Error, "Unable to cache #{value.class.name}"
  end
end

#double(value) ⇒ Object



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

def double(value)
  @format << PACK_DOUBLE
  @values << value
end

#float(value) ⇒ Object



52
53
54
55
# File 'lib/ignite/request.rb', line 52

def float(value)
  @format << PACK_FLOAT
  @values << value
end

#int(value) ⇒ Object



42
43
44
45
# File 'lib/ignite/request.rb', line 42

def int(value)
  @format << PACK_INT
  @values << value
end

#long(value) ⇒ Object



47
48
49
50
# File 'lib/ignite/request.rb', line 47

def long(value)
  @format << PACK_LONG
  @values << value
end

#short(value) ⇒ Object



37
38
39
40
# File 'lib/ignite/request.rb', line 37

def short(value)
  @format << PACK_SHORT
  @values << value
end

#string(value) ⇒ Object



62
63
64
65
66
67
# File 'lib/ignite/request.rb', line 62

def string(value)
  byte TYPE_STRING
  int value.bytesize
  @format << "a#{value.bytesize}"
  @values << value
end

#to_bytesObject

reduce allocations by packing together but need to make sure values aren’t modified between when they are added and packed



21
22
23
24
25
26
# File 'lib/ignite/request.rb', line 21

def to_bytes
  buffer = @values.pack(@format)
  # update length
  buffer[0..3] = [buffer.bytesize - 4].pack(PACK_INT)
  buffer
end