Class: Mongo::Protocol::Message Abstract
개요
MongoDB 유선 프로토콜 의 모든 메시지에 필요한 기능을 제공하는 기본 클래스입니다. 유형화된 필드를 정의하기 위한 최소한의 DSL을 제공하여 유선을 통한 직렬화 및 역직렬화를 활성화 합니다.
직접 알려진 하위 클래스
상수 요약 접기
- BATCH_SIZE =
배치 크기 상수입니다.
'batchSize'- COLLECTION =
컬렉션 상수입니다.
'컬렉션'- LIMIT =
극한 상수입니다.
'limit'- ORDERED =
순서가 지정된 상수입니다.
'주문됨'- Q =
q 상수입니다.
'q'- MAX_MESSAGE_SIZE =
기본 최대 메시지 크기는 48MB입니다.
50_331_648
직렬 변환기에 포함된 상수
Serializers::HEADER_PACK, Serializers::INT32_PACK, Serializers::INT64_PACK, Serializers::NULL, Serializers::ZERO
인스턴스 속성 요약 접기
-
#request_id ⇒ Fixnum
읽기 전용
메시지의 요청 ID를 반환합니다.
클래스 메서드 요약 접기
-
.역직렬화(io, max_message_size = MAX_MESSAGE_SIZE, expected_response_to = nil, options = {}) ⇒ 메시지
비공개
IO 스트림에서 메시지를 역직렬화합니다.
-
.deserialize_array(message, io, 필드, options = {}) ⇒ Message
비공개
메시지의 필드 배열 역직렬화합니다.
-
.deserialize_field(message, io, 필드, options = {}) ⇒ Message
비공개
메시지의 단일 필드 역직렬화합니다.
-
.deserialize_header(io) ⇒ Array<Fixnum>
비공개
메시지 헤더를 역직렬화합니다.
-
.필드(이름, 유형, 다중 = false) ⇒ NilClass
비공개
메시지 필드 선언하는 메서드입니다.
-
.필드 ⇒ 정수
비공개
메시지 클래스의 필드를 가져오기 위한 클래스 메서드입니다.
인스턴스 메서드 요약 접기
-
#==(기타) ⇒ 참, 거짓 (동의어: #eql?)
클래스 값과 필드 값을 비교하여 두 개의 유선 프로토콜 메시지가 동일한지 테스트합니다.
-
#hash ⇒ Fixnum
메시지의 필드 값에서 해시를 생성합니다.
-
#initialize(*_args) ⇒ 메시지
생성자
:nodoc:.
-
#may_add_server_api(server_api) ⇒ 객체
서버 API 옵션을 지원 프로토콜 메시지 하위 클래스는 이 메서드를 재정의하여 메시지에 서버 API 문서 추가해야 합니다.
-
#may_compress(_compressor, _zlib_compression_level = nil) ⇒ 자체
비공개
사용된 유선 프로토콜에서 지원하는 경우 그리고 전송 중인 명령이 압축을 허용하는 경우 메시지를 압축합니다.
-
#maybe_decrypt(_context) ⇒ Mongo::프로토콜::Msg
libmongocrypt로 이 메시지를 해독할 수 있습니다.
-
#may_encrypt(_connection, _context) ⇒ Mongo::Protocol::Msg
이 메시지를 libmongocrypt로 암호화할 수 있습니다.
-
#maybe_inflate ⇒ Protocol::Message
비공개
메시지가 압축된 경우 메시지를 확장합니다.
-
#number_returned ⇒ 0
프로토콜 메시지에 대한 기본 숫자 반환 값입니다.
-
#회신 가능? ⇒ false
메시지의 기본값은 서버에 메시지를 보낸 후 회신을 요구하지 않는 것입니다.
-
#직렬화(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ string (동의어: #to_s)
메시지를 유선으로 전송할 수 있는 바이트로 직렬화합니다.
-
#set_request_id ⇒ Fixnum
메시지에 대한 요청 ID를 생성합니다.
ID에 포함된 메서드
생성자 세부 정보
#initialize(*_args) ⇒ 메시지
:nodoc:
77 78 79 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 77 def 초기화(*_args) # :nodoc: set_request_id end |
인스턴스 속성 세부 정보
#request_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 메시지를 반환합니다).
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, expected_response_to = nil, = {}) # io 는 일반적으로 다음을 지원하는 Mongo::Socket 인스턴스 입니다. # 시간 초과 옵션. 이를 호출할 수 있는 사람과의 호환성을 위해 # 메서드를 다른 IO와 유사한 객체 와 함께 사용하여 다음과 같은 경우에만 옵션을 전달합니다. # 비어 있지 않습니다. = .슬라이스(:timeout, :socket_timeout) 청크 = 만약 .비어 있나요? io.읽기(16) other io.읽기(16, **) end buf = BSON::ByteBuffer.신규(청크) 분량, _request_id, response_to, _op_code = deserialize_header(buf) # 잠재적인 DOS 메시지 가로채기 공격으로부터 보호. 참조 # 드라이버-276. 올리다 오류::MaxMessageSize.신규() 만약 분량 > ( || MAX_MESSAGE_SIZE) # 이전 요청에 대한 응답 반환으로부터 보호합니다. 참조 # RUBY-1117 만약 expected_response_to && response_to != expected_response_to 올리다 오류::예기치 않은 응답.신규(expected_response_to, response_to) end 청크 = 만약 .비어 있나요? io.읽기(분량 - 16) other io.읽기(분량 - 16, **) 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
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의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지의 단일 필드 역직렬화합니다.
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의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지 헤더를 역직렬화합니다.
336 337 338 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 336 def self.deserialize_header(io) 헤더.역직렬화(io) end |
.필드(이름, 유형, 다중 = false) ⇒ NilClass
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지 필드 선언하는 메서드
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?
클래스 값과 필드 값을 비교하여 두 개의 유선 프로토콜 메시지가 동일한지 테스트합니다.
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 |
#해시 ⇒ 수정번호
메시지의 필드 값에서 해시를 생성합니다.
301 302 303 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 301 def 해시 필드.map { |필드| instance_variable_get(필드[:name]) }.해시 end |
#may_add_server_api(server_api) ⇒ 객체
서버 API 옵션을 지원 프로토콜 메시지 하위 클래스는 이 메서드를 재정의하여 메시지에 서버 API 문서 추가해야 합니다.
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의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
사용된 유선 프로토콜 에서 지원하는 경우 그리고 전송 중인 명령이 압축을 허용하는 경우 메시지를 압축합니다. 그렇지 않으면 자체를 반환합니다.
110 111 112 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 110 def may_compress(_compressor, 압축 = nil) self end |
#may_decrypt(_context) ⇒ Mongo::프로토콜::Msg
libmongocrypt로 이 메시지를 해독할 수 있습니다.
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로 암호화할 수 있습니다.
166 167 168 169 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 166 def may_encrypt(_connection, _context) # 메시지 하위 클래스가 이 메서드를 구현하지 않은 경우 아무 작업도 수행하지 않습니다. self end |
#may_inflate ⇒ Protocol::Message
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지가 압축된 경우 메시지를 확장합니다.
140 141 142 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 140 def may_inflate self end |
#number_returned ⇒ 0
프로토콜 메시지에 대한 기본 숫자 반환 값입니다.
319 320 321 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 319 def number_returned 0 end |
#회신 가능? ⇒ false
메시지의 기본값은 서버에 메시지를 보낸 후 회신을 요구하지 않는 것입니다.
95 96 97 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 95 def 회신 가능? 거짓 end |
#직렬화(버퍼 = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ string to_s 라고도 함
메시지를 유선으로 전송할 수 있는 바이트로 직렬화합니다.
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_id ⇒ Fixnum
메시지에 대한 요청 ID를 생성합니다.
310 311 312 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 310 def set_request_id @request_id = self.클래스.Next_id end |