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_header(io) ⇒ Array<Fixnum>
비공개
메시지 헤더를 역직렬화합니다.
-
.필드(이름, 유형, 다중 = false) ⇒ NilClass
비공개
메시지 필드 선언하는 메서드입니다.
-
.필드 ⇒ 정수
비공개
메시지 클래스의 필드를 가져오기 위한 클래스 메서드입니다.
인스턴스 메서드 요약 접기
-
#==(기타) ⇒ 참, 거짓 (동의어: #eql?)
클래스 값과 필드 값을 비교하여 두 개의 유선 프로토콜 메시지가 동일한지 테스트합니다.
-
#deserialize_array(io, 필드, options = {}) ⇒ 배열
비공개
메시지의 필드 배열 역직렬화합니다.
-
#deserialize_field(io, 필드, options = {}) ⇒ 객체
비공개
단일 필드를 이 메시지로 역직렬화합니다.
-
#필드 ⇒ 배열<Hash>
비공개
메시지 클래스의 필드를 가져오는 메서드입니다.
-
#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)
메시지를 유선으로 전송할 수 있는 바이트로 직렬화합니다.
-
#serialize_fields(buffer, max_bson_size = nil) ⇒ string
비공개
메시지 필드를 버퍼로 직렬화합니다.
-
#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 메시지를 반환합니다).
231 232 233 234 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 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 231 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).할당하다 .필드.각 do |필드| 만약 필드[:multi] .deserialize_array(buf, 필드, ) other .deserialize_field(buf, 필드, ) end end .fix_after_deserialization 만약 .is_a?(메시지) .may_inflate end |
.deserialize_header(io) ⇒ 배열<Fixnum>
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지 헤더를 역직렬화합니다.
332 333 334 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 332 def self.deserialize_header(io) 헤더.역직렬화(io) end |
.필드(이름, 유형, 다중 = false) ⇒ NilClass
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지 필드 선언하는 메서드
352 353 354 355 356 357 358 359 360 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 352 def self.필드(이름, 유형, 멀티 = 거짓) 필드 << { 이름: :"@#{이름}", 유형: 유형, multi: 멀티 } attr_reader 이름 end |
.필드 ⇒ 정수
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지 클래스의 필드를 가져오는 클래스 메서드
323 324 325 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 323 def self.필드 @fields ||= [] end |
인스턴스 메서드 세부 정보
#==(기타) ⇒ true, false ~ 라고도 함: eql?
클래스 값과 필드 값을 비교하여 두 개의 유선 프로토콜 메시지가 동일한지 테스트합니다.
283 284 285 286 287 288 289 290 291 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 283 def ==(기타) 반환 거짓 만약 self.클래스 != 기타.클래스 필드.모두? do |필드| 이름 = 필드[:name] instance_variable_get(이름) == 기타.instance_variable_get(이름) end end |
#deserialize_array(io, 필드, options = {}) ⇒ 배열
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지의 필드 배열 역직렬화합니다.
배열 의 항목 수는 키 아래의 필드 dsl로 클래스에 지정된 이전에 역직렬화된 필드 로 설명되어야 합니다. :multi
377 378 379 380 381 382 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 377 def deserialize_array(io, 필드, = {}) 요소 = [] 카운트 = instance_variable_get(필드[:multi]) 카운트.시간 { 요소 << 필드[:type].역직렬화(io, ) } instance_variable_set(필드[:name], 요소) end |
#deserialize_field(io, 필드, options = {}) ⇒ Object
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
단일 필드를 이 메시지로 역직렬화합니다.
395 396 397 398 399 400 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 395 def deserialize_field(io, 필드, = {}) instance_variable_set( 필드[:name], 필드[:type].역직렬화(io, ) ) end |
#필드 ⇒ 배열<Hash>
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지 클래스의 필드를 가져오는 메서드
406 407 408 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 406 def 필드 self.클래스.필드 end |
#해시 ⇒ 수정번호
메시지의 필드 값에서 해시를 생성합니다.
297 298 299 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 297 def 해시 필드.map { |필드| instance_variable_get(필드[:name]) }.해시 end |
#may_add_server_api(server_api) ⇒ 객체
서버 API 옵션을 지원 프로토콜 메시지 하위 클래스는 이 메서드를 재정의하여 메시지에 서버 API 문서 추가해야 합니다.
171 172 173 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 171 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 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 150 def may_decrypt(_context) self end |
#maybe_encrypt(_connection, _context) ⇒ Mongo::프로토콜::Msg
이 메시지를 libmongocrypt로 암호화할 수 있습니다.
162 163 164 165 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 162 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
프로토콜 메시지에 대한 기본 숫자 반환 값입니다.
315 316 317 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 315 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 라고도 함
메시지를 유선으로 전송할 수 있는 바이트로 직렬화합니다.
196 197 198 199 200 201 202 203 204 205 206 207 208 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 196 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 |
#serialize_fields(buffer, max_bson_size = nil) ⇒ String
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
메시지 필드를 버퍼로 직렬화
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 415 def serialize_fields(buffer, max_bson_size = nil) 필드.각 do |필드| value = instance_variable_get(필드[:name]) 만약 필드[:multi] value.각 do |item| 만약 필드[:type].response_to?(:size_limited?) 필드[:type].직렬화(buffer, item, max_bson_size) other 필드[:type].직렬화(buffer, item) end end elsif 필드[:type].response_to?(:size_limited?) 필드[:type].직렬화(buffer, value, max_bson_size) other 필드[:type].직렬화(buffer, value) end end end |
#set_request_id ⇒ Fixnum
메시지에 대한 요청 ID를 생성합니다.
306 307 308 |
# 파일 'lib/ Mongo/ 프로토콜/message.rb', 줄 306 def set_request_id @request_id = self.클래스.Next_id end |