class Net::TTI::DataTypes::ChunkedString

Constants

MAX_CHUNK_LENGTH

The apparent maximum chunk length used by Oracle TNS implementations

MULTI_CHUNK_MARKER

The marker to indicate that a string is being divided into multiple chunks

MULTI_CHUNK_TERMINATOR

Public Instance Methods

read_and_return_value(io) click to toggle source
# File lib/net/tti/data_types/chunked_string.rb, line 17
def read_and_return_value(io)
  begin
    length = unmarshal_uint8(io)
  rescue EOFError
    return ""
  end

  if length == MULTI_CHUNK_MARKER
    data = ""
    while (length = unmarshal_uint8(io)) != MULTI_CHUNK_TERMINATOR
      data += io.readbytes(length)
    end

    return data
  else
    return io.readbytes(length)
  end
end
sensible_default() click to toggle source
# File lib/net/tti/data_types/chunked_string.rb, line 13
def sensible_default
  return ""
end
value_to_binary_string(value) click to toggle source
# File lib/net/tti/data_types/chunked_string.rb, line 36
def value_to_binary_string(value)
  return "" if value.empty?

  if value.length > MAX_CHUNK_LENGTH
    value_index = 0

    binary_string = ""
    binary_string << [MULTI_CHUNK_MARKER].pack("C")
    while value_index < value.length
      chunk = value[value_index, MAX_CHUNK_LENGTH]
      binary_string << [chunk.length, chunk].pack("Ca*")
      value_index += MAX_CHUNK_LENGTH
    end
    binary_string << [MULTI_CHUNK_TERMINATOR].pack("C")
    return binary_string
  else
    return [value.length, value].pack("Ca*")
  end
end

Private Instance Methods

unmarshal_uint8(io) click to toggle source
# File lib/net/tti/data_types/chunked_string.rb, line 57
def unmarshal_uint8(io)
  int_string = io.readbytes(1)
  return int_string.unpack("C").first
end