Classe: Mongo::Protocol::Msg Private
- Herda:
-
mensagem
- Objeto
- mensagem
- Mongo::Protocol::Msg
- Inclui:
- Monitoramento::Evento::Seguro
- Definido em:
- build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb
Visão geral
Esta classe faz parte de uma API privada. Evite usar essa classe, se possível, pois ela pode ser removida ou alterada no futuro.
MongoDB Wire protocol Msg message (OP_MSG), um opcode de protocolo de conexão bidirecional.
O OP_MSG só está disponível no MongoDB 3.6 (maxWireVersion >= 6) e posterior.
Definido sob namespace
Classes: Seção 1
Colapsode resumo constante
- DATABASE_IDENTIFIER =
Essa constante faz parte de uma API privada. Você deve evitar usar essa constante, se possível, pois ela pode ser removida ou alterada no futuro.
O identificador do nome do banco de dados de dados no qual executar o comando.
'$db'.congelar
- Internal_keys =
Essa constante faz parte de uma API privada. Você deve evitar usar essa constante, se possível, pois ela pode ser removida ou alterada no futuro.
Chaves que o driver adiciona aos comandos. Eles serão movidos para o final do hash para melhor registro.
definir.Novo(%w($clusterTime $db lsid assinatura txnNumber)).congelar
Constantes incluídas no Monitoring::Event::Secure
Monitoramento::Evento::Secure::REDACTED_COMMANDS
Constantes herdadas de Mensagem
Mongo::Protocol::Message::BATCH_SIZE, Mongo::Protocol::Message::COLLECTION, Mongo::Protocol::Message::LIMIT, Mongo::Protocol::Message::MAX_MSSAGE_SIZE, Mongo::Protocol:: Mensagem::ORDERED, Mongo::Protocol::Message::Q
Resumo do atributo de instância
Atributos herdados de Mensagem
Recolhimento do Resumo do método de instância
-
#bulk_write? ➤ Booleano
privado
Se esta mensagem representa uma escrita em massa.
- #documentos ➤ Objeto privado
-
#prefix_after_deserialization ➤ Objeto
privado
Preenche de forma reversa as variáveis de instância depois que a desserialização define a variável de instância @sections para a lista de documentos.
-
.
construtor
privado
Cria uma nova mensagem de protocolo OP_MSG.
- #may_add_server_api(server_api) ➤ Objeto privado
-
#may_compress(compressor, zlib_compression_level = nil) ➤ Mensagem
privado
Compacte a mensagem se o comando que está sendo enviado permitir a compressão.
-
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
privado
Possivelmente descriptografe esta mensagem com libmongocrypt.
-
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
privado
Possivelmente, criptografe esta mensagem com libmongocrypt.
-
#number_returned ⇒ Inteiro
privado
Retorna o número de documentos retornados do servidor.
-
#payload ➤ BSON::Document
privado
Retorne a carga útil do evento para monitoramento.
-
#respondível? ➤ verdadeiro, falso
privado
Se a mensagem espera uma resposta do banco de banco de dados.
-
#serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ➤ BSON::ByteBuffer
privado
Serializa a mensagem em bytes que podem ser enviados na transferência.
Métodos incluídos do Monitoring::Event::Secure
#compression_allowed?, #editado, #sensitive?
Métodos herdados de Mensagem
#==, deserialize, #hash, # maybe_inflete, #set_request_id
Métodos incluídos do ID
Detalhes do construtor
. _
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Cria uma nova mensagem de protocolo OP_MSG
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 66 def inicializar(flags, , main_document, *sequências) se flags flags.cada fazer |flag| a menos que KNOWN_FLAGS.chave?(flag) aumentar ArgumentError, "Unknown flag: #{flag.inspect}" end end end @flags = flags || [] @opções = a menos que main_document.is_a?(Hash) aumentar ArgumentError, "O documento principal deve ser um Hash, dado: #{main_document.classe}" end @main_document = main_document sequências.cada_com_index fazer |Seção, index| a menos que Seção.is_a?(Seção 1) aumentar ArgumentError, "Todas as sequências devem ser instâncias da Seção1 , tem: #{seção} no índice #{índice}" end end @sequences = sequências @sections = [ {tipo: 0, carga útil: @main_document} ] + @sequences.map fazer |Seção| {tipo: 1, carga útil: { identifier: Seção.identificador, sequência: Seção.documentos.map fazer |doc| CacheingHash.Novo(doc) end, }} end @request_id = nada super end |
Detalhes do método de instância
#bulk_write? ➤ Booleano
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Este método foi escrito para oferecer suporte à funcionalidade de criptografia do lado do cliente . Não é recomendável que esse método seja usado a serviço de qualquer outra funcionalidade ou comportamento.
Se esta mensagem representa uma escrita em massa. Uma escrita em massa é uma operação de inserção, atualização ou exclusão que engloba várias operações do mesmo tipo.
272 273 274 275 276 277 278 279 280 281 282 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 272 def bulk_write? Inserções = @main_document['documents'] Atualizações = @main_document['updates'] exclui = @main_document['deletes'] num_inserts = Inserções && Inserções.Tamanho || 0 num_updates = Atualizações && Atualizações.Tamanho || 0 num_deletes = exclui && exclui.Tamanho || 0 num_inserts > 1 || num_updates > 1 || num_deletes > 1 end |
#documentos ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
196 197 198 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 196 def documentos [@main_document] end |
#prefix_after_deserialization ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Preenche de forma reversa as variáveis de instância depois que a desserialização define a variável de instância @sections para a lista de documentos.
TODO corrige a desserialização para que esse método não seja necessário.
184 185 186 187 188 189 190 191 192 193 194 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 184 def Fix_after_deserialization se @sections.nada? aumentar NotImplementedError, "Após as desserializações, @sections deveriam ter sido inicializadas" end se @sections.Tamanho != 1 aumentar NotImplementedError, "A desserialização deve ter produzido exatamente uma seção, mas ela produz #{seções.comprimento} seções" end @main_document = @sections.primeiro @sequences = [] @sections = [{tipo: 0, carga útil: @main_document}] end |
#may_add_server_api(server_api) ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 284 def talvez_add_server_api(server_api) conflitos = {} %i(apiVersion apiStrict apiDeprecationErrors).cada fazer |chave| se @main_document.chave?(chave) conflitos[chave] = @main_document[chave] end se @main_document.chave?(chave.to_s) conflitos[chave] = @main_document[chave.to_s] end end a menos que conflitos.vazio? aumentar Erro::ServerApiConflict, "O cliente está configurado com a opção :server_api , mas a operação forneceu os seguintes parâmetros conflitantes: #{conflitos.inspect}" end main_document = @main_document.mesclar( Utilidades.transform_server_api(server_api) ) Msg.Novo(@flags, @opções, main_document, *@sequences) end |
#may_compress(compressor, zlib_compression_level = nil) ➤ Mensagem
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Compacte a mensagem se o comando que está sendo enviado permitir a compressão. Caso contrário, retorna auto.
174 175 176 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 174 def talvez_compress(compressor, compressor, zlib_compression_level = nada) compressor_if_possível(comando.keys.primeiro, compressor, compressor, zlib_compression_level) end |
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Possivelmente descriptografe esta mensagem com libmongocrypt. A mensagem só será descriptografada se o cliente especificado existir, se esse cliente tiver recebido opções de criptografia automática e essa mensagem for elegível para descriptografia. Uma mensagem é elegível para descriptografia se representar um dos tipos de comando permitidos listados por libmongocrypt e contiver dados que devem ser criptografados por um JSON schema local ou remoto.
251 252 253 254 255 256 257 258 259 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 251 def talvez_decrypt(Contexto) se Contexto.descriptografar? cmd = mesclar seções enc_cmd = Contexto.criptografador.Descriptografar(cmd) Msg.Novo(@flags, @opções, enc_cmd) mais auto end end |
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Possivelmente, criptografe esta mensagem com libmongocrypt. A mensagem só será criptografada se o cliente especificado existir, se esse cliente tiver recebido opções de criptografia automática e não tiver sido instruído a ignorar a criptografia automática e o cliente determinar que essa mensagem é elegível para criptografia. Uma mensagem é elegível para criptografia se representar um dos tipos de comando permitidos listados por libmongocrypt e contiver dados que devem ser criptografados por um JSON schema local ou remoto.
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 214 def talvez_encrypt(Conexão, Contexto) # A compactação de verificação TODO acontece mais tarde, ou seja, quando esse método é executado # a mensagem não é compactada. se Contexto.criptografar? se Conexão.Descrição.max_wire_version < 8 aumentar Erro::Criptografia de erro.Novo( "Não é possível executar criptografia em um servidor MongoDB com mais de " + "4.2 (versão com fio inferior a 8). Atualmente conectado ao servidor " + "com a versão max wire #{connection.descrição.max_wire_version}} " + "(A criptografia automática requer uma versão mínima do MongoDB de 4.2)" ) end db_name = @main_document[DATABASE_IDENTIFIER] cmd = mesclar seções enc_cmd = Contexto.criptografador.criptografar(db_name, cmd) se cmd.chave?('$db') && !enc_cmd.chave?('$db') enc_cmd['$db'] = cmd['$db'] end Msg.Novo(@flags, @opções, enc_cmd) mais auto end end |
#number_returned ⇒ Inteiro
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Retorna o número de documentos retornados do servidor.
A instância Msg deve ser para uma resposta do servidor e a resposta deve retornar um cursor ativo (um recém-criado ou um cuja iteração continue via getMore).
311 312 313 314 315 316 317 318 319 320 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 311 def number_returned se doc = documentos.primeiro se cursor = doc['cursor'] se lote = cursor['firstBatch'] || cursor['próximoBatch'] Método lote.Tamanho end end end aumentar NotImplementedError, "number_returned só está definido para respostas de cursor" end |
#payload ➤ BSON::Document
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Retorne a carga útil do evento para monitoramento.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 120 def Carga útil # Reordenar chaves em principal_documento para melhor registro - consulte # https://jira.mongodb.org/browse/RUBY-{01591. # Observe que, mesmo sem a reordenação, a carga útil não é exata # corresponde ao que é enviado pela rede, pois o comando conforme usado em # o evento publicado combina chaves de várias seções do # payload enviada pela transferência. ordered_command = {} skipped_command = {} comando.cada fazer |k, v| se Internal_keys.membro?(k.to_s) skipped_command[k] = v mais ordered_command[k] = v end end ordered_command.update(skipped_command) BSON::Documento.Novo( command_name: ordered_command.keys.primeiro.to_s, database_name: @main_document[DATABASE_IDENTIFIER], comando: ordered_command, request_id: request_id, resposta: @main_document, ) end |
#respondível? ➤ true, false
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Se a mensagem espera uma resposta do banco de banco de dados.
108 109 110 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 108 def respondível? @replyable ||= !flags.incluir?(:more_to_come) end |
#serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ➤ BSON::ByteBuffer
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Serializa a mensagem em bytes que podem ser enviados na transferência.
155 156 157 158 159 160 161 |
# File 'build/ruby-driver-v2.19/lib/mongo/protocol/msg.rb', linha 155 def serializar(buffer = BSON::ByteBuffer.Novo, max_bson_size = nada, bson_overhead = nada) validate_document_size!(max_bson_size) super add_check_sum(buffer) buffer end |