Class: Net::TTI::DataTypes::ChunkedString

Inherits:
BinData::BasePrimitive
  • Object
show all
Defined in:
lib/net/tti/data_types/chunked_string.rb

Constant Summary collapse

MULTI_CHUNK_MARKER =

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

0xFE
MULTI_CHUNK_TERMINATOR =
0x00
MAX_CHUNK_LENGTH =

The apparent maximum chunk length used by Oracle TNS implementations

0x40

Instance Method Summary collapse

Instance Method Details

#read_and_return_value(io) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 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_defaultObject



13
14
15
# File 'lib/net/tti/data_types/chunked_string.rb', line 13

def sensible_default
  return ""
end

#value_to_binary_string(value) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 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