Class: Mongo::Protocol::Message Abstract

상속:
객체
  • 객체
모두 표시
다음을 포함합니다.
ID, 직렬 변환기
다음에 정의됨:
lib/ Mongo/ 프로토콜/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

'컬렉션'
LIMIT =

극한 상수입니다.

이후:

  • 2.2.0

'limit'
ORDERED =

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

이후:

  • 2.2.0

'주문됨'
Q =

q 상수입니다.

이후:

  • 2.2.0

'q'
MAX_MESSAGE_SIZE =

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

이후:

  • 2.2.1

50_331_648

직렬 변환기에 포함된 상수

Serializers::HEADER_PACK, Serializers::INT32_PACK, Serializers::INT64_PACK, Serializers::NULL, Serializers::ZERO

인스턴스 속성 요약 접기

클래스 메서드 요약 접기

인스턴스 메서드 요약 접기

ID에 포함된 메서드

포함

생성자 세부 정보

#initialize(*_args) ⇒ 메시지

:nodoc:



77
78
79
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 77

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

인스턴스 속성 세부 정보

#request_idFixnum (읽기 전용)

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

반환합니다:

  • (Fixnum)

    이 메시지의 요청 ID



84
85
86
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 84

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 (숫자)

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

반환합니다:

  • (메시지)

    메시지 클래스의 인스턴스

다음을 발생시킵니다.



235
236
237
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
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 235

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

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

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

  # 이전 요청에 대한 응답 반환으로부터 보호합니다. 참조
  # 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
  메시지.fix_after_deserialization 만약 메시지.is_a?(메시지)
  메시지.may_inflate
end

.deserialize_array(message, io, 필드, options = {}) ⇒ Message

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

메시지의 필드 배열 역직렬화합니다.

배열 의 항목 수는 키 아래의 필드 dsl로 클래스에 지정된 이전에 역직렬화된 필드 로 설명되어야 합니다. :multi

매개변수:

  • 메시지 (메시지)

    역직렬화된 배열 포함할 메시지입니다.

  • io (IO)

    역직렬화할 배열 포함된 스트림입니다.

  • 필드 (해시)

    필드 나타내는 해시입니다.

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

옵션 해시(options):

  • :deserialize_as_bson (부울)

    가능한 경우 BSON types를 사용하여 이 배열 의 각 요소를 역직렬화할지 여부입니다.

반환합니다:

  • (메시지)

    역직렬화된 배열 있는 메시지입니다.



382
383
384
385
386
387
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 382

def self.deserialize_array(메시지, io, 필드, 옵션 = {})
  요소 = []
  카운트 = 메시지.instance_variable_get(필드[:multi])
  카운트.시간 { 요소 << 필드[:type].역직렬화(io, 옵션) }
  메시지.instance_variable_set(필드[:name], 요소)
end

.deserialize_field(message, io, 필드, options = {}) ⇒ Message

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

메시지의 단일 필드 역직렬화합니다.

매개변수:

  • 메시지 (메시지)

    역직렬화된 필드 포함할 메시지입니다.

  • io (IO)

    역직렬화할 필드 포함된 스트림입니다.

  • 필드 (해시)

    필드 나타내는 해시입니다.

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

옵션 해시(options):

  • :deserialize_as_bson (부울)

    가능한 경우 항상 BSON types를 사용하여 이 필드 역직렬화할지 여부입니다.

반환합니다:

  • (메시지)

    역직렬화된 필드 있는 메시지입니다.



401
402
403
404
405
406
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 401

def self.deserialize_field(메시지, io, 필드, 옵션 = {})
  메시지.instance_variable_set(
    필드[:name],
    필드[:type].역직렬화(io, 옵션)
  )
end

.deserialize_header(io) ⇒ 배열<Fixnum>

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

메시지 헤더를 역직렬화합니다.

매개변수:

  • io (IO)

    헤더가 포함된 스트림입니다.

반환합니다:

  • (Array<Fixnum>)

    역직렬화된 헤더입니다.



336
337
338
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 336

def self.deserialize_header(io)
  헤더.역직렬화(io)
end

.필드(이름, 유형, 다중 = false) ⇒ NilClass

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

메시지 필드 선언하는 메서드

매개변수:

  • 이름 (string)

    필드 이름

  • 유형 (모듈)

    유형별 직렬화 전략

  • 멀티 (true, false, 기호) (기본값은 false)

    필드 값을 :type 유형의 배열 로 직렬화하거나 배열 의 항목 수(역직렬화에 사용됨)가 있는 필드 설명하는 기호로 직렬화하려면 true 로 지정합니다.

    Note: In fields where multi is a symbol representing the field
    containing number items in the repetition, the field containing
    that information *must* be deserialized prior to deserializing
    fields that use the number.

반환합니다:

  • (NilClass)


356
357
358
359
360
361
362
363
364
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 356

def self.필드(이름, 유형, 멀티 = 거짓)
  필드 << {
    이름: :"@#{이름}",
    유형: 유형,
    multi: 멀티
  }

  attr_reader 이름
end

.필드정수

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

메시지 클래스의 필드를 가져오는 클래스 메서드

반환합니다:

  • (정수)

    메시지 클래스의 필드



327
328
329
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 327

def self.필드
  @fields ||= []
end

인스턴스 메서드 세부 정보

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

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

매개변수:

반환합니다:

  • (true, false)

    메시지의 동등성.



287
288
289
290
291
292
293
294
295
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 287

def ==(기타)
  반환 거짓 만약 self.클래스 != 기타.클래스

  필드.모두? do |필드|
    이름 = 필드[:name]
    instance_variable_get(이름) ==
      기타.instance_variable_get(이름)
  end
end

#해시 ⇒ 수정번호

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

반환합니다:

  • (Fixnum)

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



301
302
303
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 301

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

#may_add_server_api(server_api) ⇒ 객체

서버 API 옵션을 지원 프로토콜 메시지 하위 클래스는 이 메서드를 재정의하여 메시지에 서버 API 문서 추가해야 합니다.

매개변수:

  • server_api (해시)

    메시지에 추가할 서버 API 문서 .

다음을 발생시킵니다.

  • (NotImplementedError)


175
176
177
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 175

def may_add_server_api(server_api)
  올리다 NotImplementedError
end

#may_compress(_compressor, _zlib_compression_level = nil) ⇒ 자체

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

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

매개변수:

  • 압축기 (string, 기호)

    사용할 압축기입니다.

  • zlib_compression_level (정수)

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

반환합니다:

  • (self)

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

이후:

  • 2.5.0



110
111
112
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 110

def may_compress(_compressor, 압축 = nil)
  self
end

#may_decrypt(_context) ⇒ Mongo::프로토콜::Msg

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

매개변수:

반환합니다:

  • (Mongo::Protocol::Msg)

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



150
151
152
153
154
155
156
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 150

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

#maybe_encrypt(_connection, _context) ⇒ Mongo::프로토콜::Msg

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

매개변수:

반환합니다:

  • (Mongo::Protocol::Msg)

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



166
167
168
169
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 166

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

#may_inflateProtocol::Message

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

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

반환합니다:

  • (Protocol::Message)

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

이후:

  • 2.5.0



140
141
142
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 140

def may_inflate
  self
end

#number_returned0

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

반환합니다:

  • (0)

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

이후:

  • 2.5.0



319
320
321
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 319

def number_returned
  0
end

#회신 가능?false

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

예시:

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

message.replyable?

반환합니다:

  • (false)

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

이후:

  • 2.0.0



95
96
97
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 95

def 회신 가능?
  거짓
end

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

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

매개변수:

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

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

반환합니다:

  • (string)

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



200
201
202
203
204
205
206
207
208
209
210
211
212
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 200

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
    end

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

#set_request_idFixnum

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

반환합니다:

  • (Fixnum)

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



310
311
312
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 310

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