1 
2 /**
3  *    Copyright (C) 2018-present MongoDB, Inc.
4  *
5  *    This program is free software: you can redistribute it and/or modify
6  *    it under the terms of the Server Side Public License, version 1,
7  *    as published by MongoDB, Inc.
8  *
9  *    This program is distributed in the hope that it will be useful,
10  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *    Server Side Public License for more details.
13  *
14  *    You should have received a copy of the Server Side Public License
15  *    along with this program. If not, see
16  *    <http://www.mongodb.com/licensing/server-side-public-license>.
17  *
18  *    As a special exception, the copyright holders give permission to link the
19  *    code of portions of this program with the OpenSSL library under certain
20  *    conditions as described in each individual source file and distribute
21  *    linked combinations including the program with the OpenSSL library. You
22  *    must comply with the Server Side Public License in all respects for
23  *    all of the code used other than as permitted herein. If you modify file(s)
24  *    with this exception, you may extend this exception to your version of the
25  *    file(s), but you are not obligated to do so. If you do not wish to do so,
26  *    delete this exception statement from your version. If you delete this
27  *    exception statement from all source files in the program, then also delete
28  *    it in the license file.
29  */
30 
31 #pragma once
32 
33 #include "mongo/db/ops/write_ops_gen.h"
34 #include "mongo/util/net/message.h"
35 #include "mongo/util/net/op_msg.h"
36 
37 namespace mongo {
38 
39 class InsertOp {
40 public:
41     static write_ops::Insert parse(const OpMsgRequest& request);
42     static write_ops::Insert parseLegacy(const Message& msg);
43 };
44 
45 class UpdateOp {
46 public:
47     static write_ops::Update parse(const OpMsgRequest& request);
48     static write_ops::Update parseLegacy(const Message& msg);
49 };
50 
51 class DeleteOp {
52 public:
53     static write_ops::Delete parse(const OpMsgRequest& request);
54     static write_ops::Delete parseLegacy(const Message& msg);
55 };
56 
57 namespace write_ops {
58 
59 // Limit of the number of operations that can be included in a single write command. This is an
60 // attempt to avoid a large number of errors resulting in a reply that exceeds 16MB. It doesn't
61 // fully ensure that goal, but it reduces the probability of it happening. This limit should not be
62 // used if the protocol changes to avoid the 16MB limit on reply size.
63 constexpr size_t kMaxWriteBatchSize = 100'000;
64 
65 /**
66  * Retrieves the statement id for the write at the specified position in the write batch entries
67  * array.
68  */
69 int32_t getStmtIdForWriteAt(const WriteCommandBase& writeCommandBase, size_t writePos);
70 
71 template <class T>
getStmtIdForWriteAt(const T & op,size_t writePos)72 int32_t getStmtIdForWriteAt(const T& op, size_t writePos) {
73     return getStmtIdForWriteAt(op.getWriteCommandBase(), writePos);
74 }
75 
76 /**
77  * Must only be called if the insert is for the "system.indexes" namespace. Returns the actual
78  * namespace for which the index is being created.
79  */
80 NamespaceString extractIndexedNamespace(const Insert& insertOp);
81 
82 // TODO: Delete this getter once IDL supports defaults for object and array fields
83 template <class T>
84 const BSONObj& collationOf(const T& opEntry) {
85     static const BSONObj emptyBSON{};
86     return opEntry.getCollation().get_value_or(emptyBSON);
87 }
88 
89 // TODO: Delete this getter once IDL supports defaults for object and array fields
90 template <class T>
91 const std::vector<BSONObj>& arrayFiltersOf(const T& opEntry) {
92     static const std::vector<BSONObj> emptyBSONArray{};
93     return opEntry.getArrayFilters().get_value_or(emptyBSONArray);
94 }
95 
96 }  // namespace write_ops
97 }  // namespace mongo
98