Class: Net::TTI::DataTypes::ChunkedString
- Inherits:
-
BinData::BasePrimitive
- Object
- BinData::BasePrimitive
- Net::TTI::DataTypes::ChunkedString
- 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
- #read_and_return_value(io) ⇒ Object
- #sensible_default ⇒ Object
- #value_to_binary_string(value) ⇒ Object
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_default ⇒ Object
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 |