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