Class: Mongo::Protocol::Message Abstract

상속:
객체
  • 객체
모두 표시
다음을 포함합니다.
ID, 직렬 변환기
다음에 정의됨:
build/ruby-driver-v2.19/lib/mongo/protocol/message.rb

개요

이 클래스는 추상 클래스입니다.

MongoDB 유선 프로토콜 의 모든 메시지에 필요한 기능을 제공하는 기본 클래스입니다. 유형화된 필드를 정의하기 위한 최소한의 DSL을 제공하여 유선을 통한 직렬화 및 역직렬화를 활성화 합니다.

예시:

class WireProtocolMessage < Message

  private

  def op_code
    1234
  end

  FLAGS = [:first_bit, :bit_two]

  # payload
  field :flags, BitVector.new(FLAGS)
  field :namespace, CString
  field :document, Document
  field :documents, Document, true
end

직접 알려진 하위 클래스

Compressed, GetMore, KillCursors, Msg, Query, Reply

상수 요약 접기

BATCH_SIZE =

배치 크기 상수입니다.

이후:

  • 2.2.0

'batchSize'.동결
COLLECTION =

컬렉션 상수입니다.

이후:

  • 2.2.0

'collection'.동결
LIMIT =

극한 상수입니다.

이후:

  • 2.2.0

'limit'.동결
ORDERED =

순서가 지정된 상수입니다.

이후:

  • 2.2.0

'order'.동결
Q =

q 상수입니다.

이후:

  • 2.2.0

'q'.동결
MAX_MESSAGE_SIZE =

기본 최대 메시지 크기는 48MB입니다.

이후:

  • 2.2.1

50331648.동결

인스턴스 속성 요약 접기

클래스 메서드 요약 접기

인스턴스 메서드 요약 접기

ID에 포함된 메서드

포함

생성자 세부 정보

#initialize(*args) ⇒ 메시지

:nodoc:



79
80
81
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 79

def 초기화(*args) # :nodoc:
  set_request_id
end

인스턴스 속성 세부 정보

#request_idFixnum (읽기 전용)

메시지의 요청 ID를 반환합니다.

반환합니다:

  • (Fixnum)

    이 메시지의 요청 ID



86
87
88
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 86

def request_id
  @request_id
end

클래스 메서드 세부 정보

.역직렬화(io, max_message_size = MAX_MESSAGE_SIZE, expected_response_to = nil, options = {}) ⇒ 메시지

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

IO 스트림에서 메시지를 역직렬화합니다.

이 메서드는 압축 해제된 메시지를 반환합니다(즉, 유선 메시지가 OP_COMPRESSED인 경우 이 메서드는 일반적으로 압축 해제 결과인 OP_MSG 메시지를 반환합니다).

매개변수:

  • max_message_size (정수) (기본값: MAX_MESSAGE_SIZE)

    최대 메시지 크기입니다.

  • io (IO)

    메시지가 포함된 스트림

  • 옵션 (해시) (기본값: {})

옵션 해시(options):

  • :deserialize_as_bson (부울)

    가능한 BSON types Ruby 경우 네이티브 유형 대신 을 사용하여 이 메시지를 역직렬화할지 여부입니다.

  • :socket_timeout (숫자)

    각 읽기 작업에 사용할 시간 제한입니다.

반환합니다:

  • (메시지)

    메시지 클래스의 인스턴스



238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 238

def self.역직렬화(io,
  max_message_size = MAX_MESSAGE_SIZE,
  expected_response_to = nil,
  옵션 = {}
)
  # io 는 일반적으로 다음을 지원하는 Mongo::Socket 인스턴스 입니다.
  # 시간 초과 옵션. 이를 호출할 수 있는 사람과의 호환성을 위해
  # 메서드를 다른 IO와 유사한 객체 와 함께 사용하여 다음과 같은 경우에만 옵션을 전달합니다.
  # 비어 있지 않습니다.
  read_options = {}
  만약 타임아웃 = 옵션[:socket_timeout]
    read_options[:timeout] = 타임아웃
  end

  만약 read_options.비어 있나요?
    청크 = io.읽기(16)
  other
    청크 = io.읽기(16, **read_options)
  end
  buf = BSON::ByteBuffer.신규(청크)
  분량, _request_id, response_to, _op_code = deserialize_header(buf)

  # 잠재적인 DOS 메시지 가로채기 공격으로부터 보호. 참조
  # 드라이버-276.
  만약 분량 > (max_message_size || MAX_MESSAGE_SIZE)
    올리다 오류::MaxMessageSize.신규(max_message_size)
  end

  # 이전 요청에 대한 응답 반환으로부터 보호합니다. 참조
  # RUBY-1117
  만약 expected_response_to && response_to != expected_response_to
    올리다 오류::예기치 않은 응답.신규(expected_response_to, response_to)
  end

  만약 read_options.비어 있나요?
    청크 = io.읽기(분량 - 16)
  other
    청크 = io.읽기(분량 - 16, **read_options)
  end
  buf = BSON::ByteBuffer.신규(청크)

  메시지 = 레지스트리.get(_op_code).할당하다
  메시지.send(:fields). do |필드|
    만약 필드[:multi]
      deserialize_array(메시지, buf, 필드, 옵션)
    other
      deserialize_field(메시지, buf, 필드, 옵션)
    end
  end
  만약 메시지.is_a?(메시지)
    메시지.fix_after_deserialization
  end
  메시지.may_inflate
end

인스턴스 메서드 세부 정보

#==(기타) ⇒ true, false ~ 라고도 함: eql?

클래스 값과 필드 값을 비교하여 두 개의 유선 프로토콜 메시지가 동일한지 테스트합니다.

매개변수:

반환합니다:

  • (true, false)

    메시지의 동등성.



298
299
300
301
302
303
304
305
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 298

def ==(기타)
  반환 거짓 만약 self.클래스 != 기타.클래스
  필드.모두? do |필드|
    이름 = 필드[:name]
    instance_variable_get(이름) ==
      기타.instance_variable_get(이름)
  end
end

#해시 ⇒ 수정번호

메시지의 필드 값에서 해시를 생성합니다.

반환합니다:

  • (Fixnum)

    메시지의 해시 코드입니다.



311
312
313
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 311

def 해시
  필드.map { |필드| instance_variable_get(필드[:name]) }.해시
end

#may_add_server_api(server_api) ⇒ 객체

다음을 발생시킵니다.



173
174
175
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 173

def may_add_server_api(server_api)
  올리다 오류::ServerApiNotSupported, "서버 API 매개변수는3.6 이전 MongoDB 서버로 전송할 수 없습니다. 클라이언트 옵션에서 :server_api 매개변수를 제거 하거나 MongoDB 3.6 이상을 사용하세요."
end

#may_compress(압축기, zlib_compression_level = nil) ⇒ 자체

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

사용된 유선 프로토콜 에서 지원하는 경우 그리고 전송 중인 명령이 압축을 허용하는 경우 메시지를 압축합니다. 그렇지 않으면 자체를 반환합니다.

매개변수:

  • 압축기 (string, 기호)

    사용할 압축기입니다.

  • zlib_compression_level (정수) (기본값: nil)

    사용할 zlib 압축 수준입니다.

반환합니다:

  • (self)

    항상 자신을 반환합니다. 다른 메시지 유형은 이 메서드를 재정의해야 합니다.

이후:

  • 2.5.0



112
113
114
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 112

def may_compress(압축기, zlib_compression_level = nil)
  self
end

#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg

libmongocrypt로 이 메시지를 해독할 수 있습니다.

매개변수:

반환합니다:

  • (Mongo::Protocol::Msg)

    해독된 메시지 또는 해독이 불가능하거나 필요하지 않은 경우 원본 메시지입니다.



152
153
154
155
156
157
158
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 152

def may_decrypt(컨텍스트)
  # TODO는 이전4.2에서 들어오는 데이터를 해독해야 하는지 여부를 결정합니다.
  서버 #개, 잠재적으로 레거시 유선 프로토콜을 사용할 수 있습니다. 그렇다면 다음이 필요합니다.
  # 해당 유선 프로토콜에 대한 암호 해독을 현재
  # 암호화/복호화 코드는 OP_MSG에 따라 다릅니다.
  self
end

#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg

이 메시지를 libmongocrypt로 암호화할 수 있습니다.

매개변수:

반환합니다:

  • (Mongo::Protocol::Msg)

    암호화됨 메시지 또는 암호화 가 불가능하거나 필요하지 않은 경우 원본 메시지입니다.



168
169
170
171
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 168

def may_encrypt(연결, 컨텍스트)
  # 메시지 하위 클래스가 이 메서드를 구현하지 않은 경우 아무 작업도 수행하지 않습니다.
  self
end

#may_inflateProtocol::Message

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

메시지가 압축된 경우 메시지를 확장합니다.

반환합니다:

  • (Protocol::Message)

    항상 자신을 반환합니다. 하위 클래스는 필요에 따라 이 메서드를 재정의해야 합니다.

이후:

  • 2.5.0



142
143
144
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 142

def may_inflate
  self
end

#number_returned0

프로토콜 메시지에 대한 기본 숫자 반환 값입니다.

반환합니다:

  • (0)

    이 메서드는 재정의해야 하며, 그렇지 않으면 항상 0 을 반환합니다.

이후:

  • 2.5.0



329
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 329

def number_returned; 0; end

#회신 가능?false

메시지의 기본값은 서버에 메시지를 보낸 후 회신을 요구하지 않는 것입니다.

예시:

메시지에 회신이 필요합니까?

message.replyable?

반환합니다:

  • (false)

    기본값은 회신을 요구하지 않는 것입니다.

이후:

  • 2.0.0



97
98
99
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 97

def 회신 가능?
  거짓
end

#직렬화(버퍼 = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ string to_s 라고도 함

메시지를 유선으로 전송할 수 있는 바이트로 직렬화합니다.

매개변수:

  • buffer (string) (기본값: BSON::ByteBuffer.new)

    메시지를 삽입해야 하는 버퍼

반환합니다:

  • (string)

    직렬화된 메시지가 포함된 버퍼



201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 201

def 직렬화(buffer = BSON::ByteBuffer.신규, max_bson_size = nil, bson_overhead = nil)
  max_size =
    만약 max_bson_size && bson_overhead
      max_bson_size + bson_overhead
    elsif max_bson_size
      max_bson_size
    other
      nil
    end

  시작하기 = buffer.분량
  serialize_header(buffer)
  serialize_fields(buffer, max_size)
  buffer.replace_int32(시작하기, buffer.분량 - 시작하기)
end

#set_request_idFixnum

메시지에 대한 요청 ID를 생성합니다.

반환합니다:

  • (Fixnum)

    서버에 메시지를 보내는 데 사용되는 요청 ID입니다. 서버는 이 ID를 회신의 response_to 필드에 넣습니다.



320
321
322
# 파일 'build/ruby-driver-v2.19/lib/mongo/protocol/message.rb', 줄 320

def set_request_id
  @request_id = self.클래스.Next_id
end