Class: LocalDevelopmentGateway::DatabaseRouter::Tds::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/local_development_gateway/database_router/tds/message.rb

Defined Under Namespace

Classes: Packet

Constant Summary collapse

MAX_BYTES =
1024 * 1024
MAX_PACKETS =
16

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(packets) ⇒ Message

Returns a new instance of Message.



49
50
51
# File 'lib/local_development_gateway/database_router/tds/message.rb', line 49

def initialize(packets)
  @packets = packets
end

Instance Attribute Details

#packetsObject (readonly)

Returns the value of attribute packets.



12
13
14
# File 'lib/local_development_gateway/database_router/tds/message.rb', line 12

def packets
  @packets
end

Class Method Details

.read(io, deadline:) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/local_development_gateway/database_router/tds/message.rb', line 14

def self.read(io, deadline:)
  packets = []
  size = 0
  loop do
    if packets.length >= MAX_PACKETS
      raise Error, "TDS message has too many packets"
    end

    header = DatabaseRouter::Wire.read_exactly(io, 8, deadline: deadline)
    length = header.byteslice(2, 2).unpack1("n")
    raise Error, "Invalid TDS packet length" if length < 8

    size += length - 8
    raise Error, "TDS message is too large" if size > MAX_BYTES

    packets << Packet.new(
      header: header,
      payload:
        DatabaseRouter::Wire.read_exactly(
          io,
          length - 8,
          deadline: deadline
        )
    )
    break if header.getbyte(1) & 1 == 1
  end
  new(packets)
end

.write(io, message) ⇒ Object



43
44
45
46
47
# File 'lib/local_development_gateway/database_router/tds/message.rb', line 43

def self.write(io, message)
  message.packets.each do |packet|
    io.write(packet.header, packet.payload)
  end
end

Instance Method Details

#payloadObject



53
54
55
# File 'lib/local_development_gateway/database_router/tds/message.rb', line 53

def payload
  packets.map(&:payload).join
end