class Ignite::Request

Constants

MAX_LONG
MIN_LONG

Public Class Methods

new(op_code) click to toggle source
# 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

Public Instance Methods

array(type_code, value, pack) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# File lib/ignite/request.rb, line 28
def bool(value)
  byte(value ? 1 : 0)
end
byte(value) click to toggle source
# File lib/ignite/request.rb, line 32
def byte(value)
  @format << PACK_BYTE
  @values << value
end
data_object(value) click to toggle source
# 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) click to toggle source
# File lib/ignite/request.rb, line 57
def double(value)
  @format << PACK_DOUBLE
  @values << value
end
float(value) click to toggle source
# File lib/ignite/request.rb, line 52
def float(value)
  @format << PACK_FLOAT
  @values << value
end
int(value) click to toggle source
# File lib/ignite/request.rb, line 42
def int(value)
  @format << PACK_INT
  @values << value
end
long(value) click to toggle source
# File lib/ignite/request.rb, line 47
def long(value)
  @format << PACK_LONG
  @values << value
end
short(value) click to toggle source
# File lib/ignite/request.rb, line 37
def short(value)
  @format << PACK_SHORT
  @values << value
end
string(value) click to toggle source
# File lib/ignite/request.rb, line 62
def string(value)
  byte TYPE_STRING
  int value.bytesize
  @format << "a#{value.bytesize}"
  @values << value
end
to_bytes() click to toggle source

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

# 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