class Aerospike::Info

Polymorphic value classes used to efficiently serialize objects into the wire protocol.

Public Class Methods

parse_multiple_response(buf_length, buffer) click to toggle source
# File lib/aerospike/info.rb, line 57
def self.parse_multiple_response(buf_length, buffer)
  res = {}
  buffer.read(0, buf_length).split("\n").each do |vstr|
    k, v = vstr.split("\t")
    res[k] = v
  end
  res
end
request(conn, *commands) click to toggle source
# File lib/aerospike/info.rb, line 26
def self.request(conn, *commands)
  buffer = Buffer.get

  # If conservative estimate may be exceeded, get exact estimate
  # to preserve memory and resize buffer.
  offset = 8

  commands.each do |command|
    offset += command.bytesize + 1
  end

  buffer.resize(offset)

  offset = 8 # Skip size field.

  # The command format is: <name1>\n<name2>\n...
  commands.each do |command|
    buffer.write_binary(command, offset)
    offset += command.bytesize
    buffer.write_byte("\n", offset)
    offset += 1
  end

  begin
    buf_length = send_command(conn, offset, buffer)
    parse_multiple_response(buf_length, buffer)
  ensure
    Buffer.put(buffer)
  end
end
send_command(conn, offset, buffer) click to toggle source
# File lib/aerospike/info.rb, line 68
def self.send_command(conn, offset, buffer)
    # Write size field.
    size = (offset - 8) | (2 << 56) | (1 << 48)

    buffer.write_int64(size, 0)
    conn.write(buffer, offset)

    # Read - reuse input buffer.
    conn.read(buffer, 8)

    size = buffer.read_int64(0)
    length = size & 0xFFFFFFFFFFFF

    buffer.resize(length)

    conn.read(buffer, length)
    length
rescue => e
    Aerospike.logger.error(e)
    conn.close if conn
    raise e
end