diff options
Diffstat (limited to 'src/mongo/rpc/command_reply_builder.cpp')
-rw-r--r-- | src/mongo/rpc/command_reply_builder.cpp | 141 |
1 files changed, 69 insertions, 72 deletions
diff --git a/src/mongo/rpc/command_reply_builder.cpp b/src/mongo/rpc/command_reply_builder.cpp index 0fe84ecf424..d21358e053a 100644 --- a/src/mongo/rpc/command_reply_builder.cpp +++ b/src/mongo/rpc/command_reply_builder.cpp @@ -37,79 +37,76 @@ namespace mongo { namespace rpc { - CommandReplyBuilder::CommandReplyBuilder() - : _message{stdx::make_unique<Message>()} - {} - - CommandReplyBuilder::CommandReplyBuilder(std::unique_ptr<Message> message) - : _message{std::move(message)} - {} - - CommandReplyBuilder& CommandReplyBuilder::setMetadata(BSONObj metadata) { - invariant(_state == State::kMetadata); - metadata.appendSelfToBufBuilder(_builder); - _state = State::kCommandReply; - return *this; - } - - CommandReplyBuilder& CommandReplyBuilder::setRawCommandReply(BSONObj commandReply) { - invariant(_state == State::kCommandReply); - commandReply.appendSelfToBufBuilder(_builder); - _state = State::kOutputDocs; - return *this; - } - - CommandReplyBuilder& CommandReplyBuilder::addOutputDocs(DocumentRange outputDocs) { - invariant(_state == State::kOutputDocs); - auto rangeData = outputDocs.data(); - _builder.appendBuf(rangeData.data(), rangeData.length()); - // leave state as is as we can add as many outputDocs as we want. - return *this; - } - - CommandReplyBuilder& CommandReplyBuilder::addOutputDoc(BSONObj outputDoc) { - invariant(_state == State::kOutputDocs); - outputDoc.appendSelfToBufBuilder(_builder); - return *this; - } - - ReplyBuilderInterface::State CommandReplyBuilder::getState() const { - return _state; - } - - Protocol CommandReplyBuilder::getProtocol() const { - return rpc::Protocol::kOpCommandV1; - } - - void CommandReplyBuilder::reset() { - // If we are in State::kMetadata, we are already in the 'start' state, so by - // immediately returning, we save a heap allocation. - if (_state == State::kMetadata) { - return; - } - _builder.reset(); - _message = stdx::make_unique<Message>(); - _state = State::kMetadata; - } - - std::unique_ptr<Message> CommandReplyBuilder::done() { - invariant(_state == State::kOutputDocs); - // TODO: we can elide a large copy here by transferring the internal buffer of - // the BufBuilder to the Message. - _message->setData(dbCommandReply, _builder.buf(), _builder.len()); - _state = State::kDone; - return std::move(_message); - } - - std::size_t CommandReplyBuilder::availableSpaceForOutputDocs() const { - invariant (State::kDone != _state); - int intLen = _builder.len(); - invariant(0 <= intLen); - std::size_t len = static_cast<std::size_t>(intLen); - std::size_t msgHeaderSz = static_cast<std::size_t>(MsgData::MsgDataHeaderSize); - invariant(len + msgHeaderSz <= mongo::MaxMessageSizeBytes); - return mongo::MaxMessageSizeBytes - len - msgHeaderSz; +CommandReplyBuilder::CommandReplyBuilder() : _message{stdx::make_unique<Message>()} {} + +CommandReplyBuilder::CommandReplyBuilder(std::unique_ptr<Message> message) + : _message{std::move(message)} {} + +CommandReplyBuilder& CommandReplyBuilder::setMetadata(BSONObj metadata) { + invariant(_state == State::kMetadata); + metadata.appendSelfToBufBuilder(_builder); + _state = State::kCommandReply; + return *this; +} + +CommandReplyBuilder& CommandReplyBuilder::setRawCommandReply(BSONObj commandReply) { + invariant(_state == State::kCommandReply); + commandReply.appendSelfToBufBuilder(_builder); + _state = State::kOutputDocs; + return *this; +} + +CommandReplyBuilder& CommandReplyBuilder::addOutputDocs(DocumentRange outputDocs) { + invariant(_state == State::kOutputDocs); + auto rangeData = outputDocs.data(); + _builder.appendBuf(rangeData.data(), rangeData.length()); + // leave state as is as we can add as many outputDocs as we want. + return *this; +} + +CommandReplyBuilder& CommandReplyBuilder::addOutputDoc(BSONObj outputDoc) { + invariant(_state == State::kOutputDocs); + outputDoc.appendSelfToBufBuilder(_builder); + return *this; +} + +ReplyBuilderInterface::State CommandReplyBuilder::getState() const { + return _state; +} + +Protocol CommandReplyBuilder::getProtocol() const { + return rpc::Protocol::kOpCommandV1; +} + +void CommandReplyBuilder::reset() { + // If we are in State::kMetadata, we are already in the 'start' state, so by + // immediately returning, we save a heap allocation. + if (_state == State::kMetadata) { + return; } + _builder.reset(); + _message = stdx::make_unique<Message>(); + _state = State::kMetadata; +} + +std::unique_ptr<Message> CommandReplyBuilder::done() { + invariant(_state == State::kOutputDocs); + // TODO: we can elide a large copy here by transferring the internal buffer of + // the BufBuilder to the Message. + _message->setData(dbCommandReply, _builder.buf(), _builder.len()); + _state = State::kDone; + return std::move(_message); +} + +std::size_t CommandReplyBuilder::availableSpaceForOutputDocs() const { + invariant(State::kDone != _state); + int intLen = _builder.len(); + invariant(0 <= intLen); + std::size_t len = static_cast<std::size_t>(intLen); + std::size_t msgHeaderSz = static_cast<std::size_t>(MsgData::MsgDataHeaderSize); + invariant(len + msgHeaderSz <= mongo::MaxMessageSizeBytes); + return mongo::MaxMessageSizeBytes - len - msgHeaderSz; +} } // rpc } // mongo |