summaryrefslogtreecommitdiff
path: root/src/mongo/rpc/command_reply_builder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/rpc/command_reply_builder.cpp')
-rw-r--r--src/mongo/rpc/command_reply_builder.cpp141
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