Class: Mongo::Protocol::Message Abstract

継承:
オブジェクト
  • オブジェクト
すべて表示
次のことが含まれます。
ID 、シリアライザー
定義:
lib/mongo/プロトコル/message.rb

Overview

このクラスは抽象です。

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

既知のサブクラスを直接確認

圧縮 、 Get More 、 killCursors 、 MSg 、 クエリ 、 応答

定数の概要の削減

Batch_SIZE =

バッチ サイズ 定数。

以来

  • 2.2.0

'batchSize'
コレクション =

コレクション 定数。

以来

  • 2.2.0

'コレクション'
LIMIT =

制限定数。

以来

  • 2.2.0

'limit'
ORDERED =

順序付けられた定数。

以来

  • 2.2.0

'ordered'
Q =

q 定数。

以来

  • 2.2.0

'q'
MAX_MESSAGE_SIZE =

デフォルトの最大メッセージサイズは48 MB です。

以来

  • 2.2.1

50_331_648

シリアライザーに含まれる定数

シリアライザー::HEADER_PACK、シリアライザー::int32_PACK、シリアライザー::INT64_PACK、シリアライザー::NULL、シリアライザー::ゼロ

インスタンス属性の概要を折りたたむ

クラスメソッドの概要を折りたたむ

インスタンス メソッドの概要を折りたたむ

IDに含まれるメソッド

次が含まれます:

コンストラクターの詳細

#initialize(*_args) ⇒ メッセージ

:nodoc:



77
78
79
# ファイル 'lib/mongo/プロトコル/message.rb', 行 77

デフォルト 初期化(*_args) # :nodoc:
  set_request_id
end

インスタンス属性の詳細

# request_id = 修正数(読み取り専用)

メッセージのリクエスト ID を返します

次の値を返します。

  • (Fixnum) —

    このメッセージのリクエスト ID



84
85
86
# ファイル 'lib/mongo/プロトコル/message.rb', 行 84

デフォルト request_id
  @request_id
end

クラスメソッドの詳細

。逆シリアル化(io、max_message_size =MAX_MESSAGE_SIZE、expireAfterSeconds_to =nil、オプション = {}) =メッセージ

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

IO ストリームからメッセージを逆シリアル化します。

このメソッドは解凍されたメッセージを返します(つまり、ネットワーク上のメッセージが OP_COMPRESSED の場合、このメソッドは通常、解凍の結果である OP_MSG メッセージを返します)。

パラメーター:

  • max_message_size (整数) (デフォルトはMAX_MESSAGE_SIZE ) —

    最大メッセージ サイズ。

  • io (IO) —

    メッセージを含むストリーム

  • options (ハッシュ) (デフォルトは{}です)

オプション ハッシュ( options ):

  • :deserialize_as_bson (ブール値) —

    このメッセージを、可能な場合はネイティブBSON types Ruby型ではなく を使用して逆シリアル化するかどうか。

  • :socket_timeout (数値) —

    各読み取り操作に使用するタイムアウト。

次の値を返します。

次の値が発生します。



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

デフォルト 自己.逆シリアル化(io,
                     max_message_size = MAX_MESSAGE_SIZE,
                     requested_ response_to = nil,
                     options = {})
  # io は通常、次をサポートする Mongo::Socket インスタンスです。
  # タイムアウト オプション。 これを呼び出す可能性のあるものとの互換性
  他の IO のようなオブジェクトを含む# メソッドでは、次の場合にのみオプションを渡します。
  # は空ではありません。
  read_options = options.スライス(:timeout, :socket_timeout)

  チャンク = 場合 read_options.空の場合
            io.読み取り(16)
          else
            io.読み取り(16, **read_options)
          end
  バッファ = BSON::Byteバッファ.新着情報(チャンク)
  Length, _request_id, response_to, _op_code = deserialize_header(バッファ)

  # 潜在的な DOS 中間者攻撃(man-in-the-middle attack)からの保護。 利用可能な認証メカニズムについては、
  ドライバー - 276 。
  発生 エラー::MaxMessageSize.新着情報(max_message_size) 場合 Length > (max_message_size || MAX_MESSAGE_SIZE)

  # 以前のリクエストへの応答が返されないように保護します。 利用可能な認証メカニズムについては、
  #Ruby- 1117
  場合 requested_ response_to & & response_to != requested_ response_to
    発生 エラー::UnexpectedResponse.新着情報(requested_ response_to, response_to)
  end

  チャンク = 場合 read_options.空の場合
            io.読み取り(Length - 16)
          else
            io.読み取り(Length - 16, **read_options)
          end
  バッファ = BSON::Byteバッファ.新着情報(チャンク)

  メッセージ = レジストリ.得る(_op_code).割り当てる
  メッセージ.フィールド.各 行う |フィールド|
    場合 フィールド[:multi]
      メッセージ.deserialize_array(バッファ, フィールド, options)
    else
      メッセージ.deserialize_field(バッファ, フィールド, options)
    end
  end
  メッセージ.fix_ after_deserialization 場合 メッセージ.is_a?(Msg)
  メッセージ.Max_infrate
end

。 deserialize_header (io) = 配列[Fixnum]<Fixnum>

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

メッセージのヘッダーを逆シリアル化

パラメーター:

  • io (IO) —

    ヘッダーを含むストリーム。

次の値を返します。

  • ( Array <Fixnum> ) —

    逆シリアル化されたヘッダー。



332
333
334
# ファイル 'lib/mongo/プロトコル/message.rb', 行 332

デフォルト 自己.deserialize_header(io)
  ヘッダー.逆シリアル化(io)
end

。フィールド(名前、型、複数 =false)⇒ nilClass

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

メッセージフィールドを宣言する方法

パラメーター:

  • name ( string ) —

    フィールドの名前

  • タイプ (モジュール) —

    タイプ固有の直列化戦略

  • multi ( 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)


352
353
354
355
356
357
358
359
360
# ファイル 'lib/mongo/プロトコル/message.rb', 行 352

デフォルト 自己.フィールド(name, タイプ, multi = false)
  フィールド < {
    name: :"@#{name}。,
    type: タイプ,
    multi: multi
  }

  attr_reader name
end

。フィールド = 整数

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

メッセージクラスのフィールドを取得するためのクラスメソッド

次の値を返します。

  • (整数) —

    メッセージクラスのフィールド



323
324
325
# ファイル 'lib/mongo/プロトコル/message.rb', 行 323

デフォルト 自己.フィールド
  @fields ||= []
end

インスタンス メソッドの詳細

# == (その他) === (その他 ) ==================================================

クラス値とフィールド値を比較して、2 つのワイヤプロトコル メッセージ間の等価性をテストします。

パラメーター:

次の値を返します。

  • ( true 、 false ) —

    メッセージの等価性。



283
284
285
286
287
288
289
290
291
# ファイル 'lib/mongo/プロトコル/message.rb', 行 283

デフォルト ==(その他)
  return false 場合 自己.クラス != その他.クラス

  フィールド.すべて? 行う |フィールド|
    name = フィールド[:name]
    instance_variable_get(name) ==
      その他.instance_variable_get(name)
  end
end

#deserialize_array(io, フィールド, options = {}) ⇒ 配列

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

メッセージ内のフィールドの配列を逆直列化します

配列内の項目数は、クラスで指定された事前に非直列化されたフィールドによって、キーの下のフィールドdsl で記述されている必要があります :multi

パラメーター:

  • io (IO) —

    逆シリアル化する配列を含むストリーム。

  • フィールド (ハッシュ) —

    フィールドを表すハッシュ。

  • options (ハッシュ) (デフォルトは{}です)

オプション ハッシュ( options ):

  • :deserialize_as_bson (ブール値) —

    可能な場合は常にBSON typesを使用して、この配列内の各要素を逆直列化するかどうか。

次の値を返します。

  • (配列) —

    逆シリアル化された配列。



377
378
379
380
381
382
# ファイル 'lib/mongo/プロトコル/message.rb', 行 377

デフォルト deserialize_array(io, フィールド, options = {})
  要素 = []
  count = instance_variable_get(フィールド[:multi])
  count.回 { 要素 < フィールド[:type].逆シリアル化(io, options) }
  instance_variable_set(フィールド[:name], 要素)
end

#deserialize_field(io, フィールド, options = {}) ⇒ オブジェクト

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

1 つのフィールドをメッセージに逆シリアル化します。

パラメーター:

  • io (IO) —

    逆シリアル化するフィールドを含むストリーム。

  • フィールド (ハッシュ) —

    フィールドを表すハッシュ。

  • options (ハッシュ) (デフォルトは{}です)

オプション ハッシュ( options ):

  • :deserialize_as_bson (ブール値) —

    可能な場合、 BSON types を使用してこのフィールドを逆直列化するかどうか。

次の値を返します。

  • (オブジェクト) —

    非直列化されたフィールド値。



395
396
397
398
399
400
# ファイル 'lib/mongo/プロトコル/message.rb', 行 395

デフォルト deserialize_field(io, フィールド, options = {})
  instance_variable_set(
    フィールド[:name],
    フィールド[:type].逆シリアル化(io, options)
  )
end

#フィールド ⇒ 配列<Hash>

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

メッセージ クラスのフィールドを取得するメソッド

次の値を返します。

  • ( <Hash>配列 ) —

    メッセージクラスのフィールド



406
407
408
# ファイル 'lib/mongo/プロトコル/message.rb', 行 406

デフォルト フィールド
  自己.クラス.フィールド
end

#hash ⇒ Fixnum

メッセージのフィールドの値からハッシュを作成します。

次の値を返します。

  • (Fixnum) —

    メッセージのハッシュコード。



297
298
299
# ファイル 'lib/mongo/プロトコル/message.rb', 行 297

デフォルト ハッシュ
  フィールド.map { |フィールド| instance_variable_get(フィールド[:name]) }.ハッシュ
end

# may_add_server_api (server_api) =オブジェクト

サーバーAPI オプションをサポートするプロトコル メッセージのサブクラスは、このメソッドをオーバーライドしてサーバーAPIドキュメントをメッセージに追加する必要があります。

パラメーター:

  • server_api (ハッシュ) —

    メッセージに追加するサーバーAPIドキュメント。

次の値が発生します。

  • (NotImplementedError)


171
172
173
# ファイル 'lib/mongo/プロトコル/message.rb', 行 171

デフォルト Max_add_server_api(server_api)
  発生 NotImplementedError
end

#Many_compress (_compressor, _zlib_compression_level = nil) = nil)========================================================================

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

使用されているワイヤプロトコルでサポートされており、送信されるコマンドで圧縮が許可されている場合は、メッセージを圧縮します。 それ以外の場合は、 は自分自身を返します。

パラメーター:

  • compressor ( string 、 Symbol ) —

    使用するコンプレッサー。

  • zlib_compression_level (整数) —

    使用する zlib 圧縮レベル。

次の値を返します。

  • (自己) —

    常に自分自身を返します。 他のメッセージ タイプは、このメソッドをオーバーライドする必要があります。

以来

  • 2.5.0



110
111
112
# ファイル 'lib/mongo/プロトコル/message.rb', 行 110

デフォルト Max_compress(_compressor, 圧縮 = nil)
  自己
end

#majority_decrypt (_context) ⇒ Mongo::プロトコル::Msg

このメッセージは libmongocrypt で復号化します。

パラメーター:

次の値を返します。

  • (Mongo::Protocol::Msg) —

    復号化されたメッセージ、または復号化が不可能または必要な場合は元のメッセージ。



150
151
152
# ファイル 'lib/mongo/プロトコル/message.rb', 行 150

デフォルト Max_decrypt(_context)
  自己
end

#majority_encrypt(_ connection, _context) → Mongo::Protocol::Msg

このメッセージは libmongocrypt で暗号化してください。

パラメーター:

次の値を返します。

  • (Mongo::Protocol::Msg) —

    暗号化されたメッセージ、または暗号化が可能または必要でなかった場合は元のメッセージ。



162
163
164
165
# ファイル 'lib/mongo/プロトコル/message.rb', 行 162

デフォルト Max_encrypt(_ connection, _context)
  #メッセージ サブクラスがこのメソッドを実装していない場合は何も行いません
  自己
end

でも、プロトコル::Message

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

メッセージが圧縮されている場合は、圧縮します。

次の値を返します。

  • (Protocol::Message) —

    常に自分自身を返します。 サブクラスは、必要に応じてこのメソッドをオーバーライドする必要があります。

以来

  • 2.5.0



140
141
142
# ファイル 'lib/mongo/プロトコル/message.rb', 行 140

デフォルト Max_infrate
  自己
end

# number_returned 0

プロトコル メッセージのデフォルトの番号。

次の値を返します。

  • ( 0 ) —

    このメソッドはオーバーライドする必要があります。そうでない場合は、常に0を返します。

以来

  • 2.5.0



315
316
317
# ファイル 'lib/mongo/プロトコル/message.rb', 行 315

デフォルト number_returned
  0
end

応答可能かどうか= false

メッセージのデフォルトでは、サーバーにメッセージを送信した後に応答は必要ありません。

例:

そのメッセージには応答が必要か。

message.replyable?

次の値を返します。

  • ( false ) —

    デフォルトでは応答は必要ありません。

以来

  • 2.0.0



95
96
97
# ファイル 'lib/mongo/プロトコル/message.rb', 行 95

デフォルト 応答可能かどうか
  false
end

#シリアル化(バッファ = BSON::Byteバッファ.new, max_bson_size = nil、 string = nil)== nil) ======================================================

メッセージをネットワーク上で送信できるバイトにシリアル化します

パラメーター:

  • バッファ ( string ) (デフォルトはBSON::Byteバッファ.new ) —

    メッセージを挿入するバッファ

次の値を返します。

  • ( string ) —

    シリアル化されたメッセージを含むバッファ



196
197
198
199
200
201
202
203
204
205
206
207
208
# ファイル 'lib/mongo/プロトコル/message.rb', 行 196

デフォルト 直列化(バッファ = BSON::Byteバッファ.新着情報, 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

  始める = バッファ.Length
  Serialize_header(バッファ)
  Serialize_fields(バッファ, max_size)
  バッファ.replace_int 32(始める, バッファ.Length - 始める)
end

#serialize_fields(buffer, max_bson_size = nil) ⇒ String

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

メッセージ フィールドをバッファにシリアライズします

パラメーター:

  • バッファ ( string ) —

    フィールドを受信するためのバッファ

次の値を返します。

  • ( string ) —

    シリアル化されたフィールドを持つバッファ



415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
# ファイル 'lib/mongo/プロトコル/message.rb', 行 415

デフォルト Serialize_fields(バッファ, max_bson_size = nil)
  フィールド.各 行う |フィールド|
    価値 = instance_variable_get(フィールド[:name])
    場合 フィールド[:multi]
      価値.各 行う |item|
        場合 フィールド[:type].respond_to?(:size_limit?)
          フィールド[:type].直列化(バッファ, item, max_bson_size)
        else
          フィールド[:type].直列化(バッファ, item)
        end
      end
    elsif フィールド[:type].respond_to?(:size_limit?)
      フィールド[:type].直列化(バッファ, 価値, max_bson_size)
    else
      フィールド[:type].直列化(バッファ, 価値)
    end
  end
end

#set_request_id ⇒ Fixnum

メッセージのリクエスト ID を生成します

次の値を返します。

  • (Fixnum) —

    サーバーにメッセージを送信するために使用される リクエスト ID 。 サーバーはこの ID を応答の response_to フィールドに書き込みます。



306
307
308
# ファイル 'lib/mongo/プロトコル/message.rb', 行 306

デフォルト set_request_id
  @request_id = 自己.クラス.next_id
end