bool _mongoc_client_recv (mongoc_client_t *client, mongoc_rpc_t *rpc, mongoc_buffer_t *buffer, uint32_t hint, bson_error_t *error) { bson_return_val_if_fail(client, false); bson_return_val_if_fail(rpc, false); bson_return_val_if_fail(buffer, false); bson_return_val_if_fail(hint, false); bson_return_val_if_fail(hint <= client->cluster.nodes_len, false); return _mongoc_cluster_try_recv (&client->cluster, rpc, buffer, hint, error); }
bool _mongoc_client_recv (mongoc_client_t *client, mongoc_rpc_t *rpc, mongoc_buffer_t *buffer, uint32_t hint, bson_error_t *error) { bson_return_val_if_fail(client, false); bson_return_val_if_fail(rpc, false); bson_return_val_if_fail(buffer, false); bson_return_val_if_fail(hint, false); bson_return_val_if_fail(hint <= MONGOC_CLUSTER_MAX_NODES, false); return _mongoc_cluster_try_recv (&client->cluster, rpc, buffer, hint, error); }
bool _mongoc_client_recv_gle (mongoc_client_t *client, uint32_t hint, bson_t **gle_doc, bson_error_t *error) { mongoc_buffer_t buffer; mongoc_rpc_t rpc; bson_iter_t iter; bool ret = false; bson_t b; ENTRY; bson_return_val_if_fail (client, false); bson_return_val_if_fail (hint, false); if (gle_doc) { *gle_doc = NULL; } _mongoc_buffer_init (&buffer, NULL, 0, NULL, NULL); if (!_mongoc_cluster_try_recv (&client->cluster, &rpc, &buffer, hint, error)) { GOTO (cleanup); } if (rpc.header.opcode != MONGOC_OPCODE_REPLY) { bson_set_error (error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "Received message other than OP_REPLY."); GOTO (cleanup); } if (_mongoc_rpc_reply_get_first (&rpc.reply, &b)) { if (gle_doc) { *gle_doc = bson_copy (&b); } if ((rpc.reply.flags & MONGOC_REPLY_QUERY_FAILURE)) { _bson_to_error (&b, error); bson_destroy (&b); GOTO (cleanup); } if (!bson_iter_init_find (&iter, &b, "ok") || BSON_ITER_HOLDS_DOUBLE (&iter)) { if (bson_iter_double (&iter) == 0.0) { _bson_to_error (&b, error); } } bson_destroy (&b); } ret = true; cleanup: _mongoc_buffer_destroy (&buffer); RETURN (ret); }