summaryrefslogtreecommitdiff
path: root/src/mongo/idl
diff options
context:
space:
mode:
authorBernard Gorman <bernard.gorman@mongodb.com>2019-11-14 21:59:35 +0000
committerevergreen <evergreen@mongodb.com>2019-11-14 21:59:35 +0000
commit23e55cb3d041236f399f7095df31cd3e3da491cc (patch)
tree25bc309af51bc66dbd46922b0cf7560b3351478a /src/mongo/idl
parentcdc44d95e169da75093f25c324aa9670e72743e8 (diff)
downloadmongo-23e55cb3d041236f399f7095df31cd3e3da491cc.tar.gz
SERVER-43860 Always upsert exact source document for pipeline-insert $merge
Diffstat (limited to 'src/mongo/idl')
-rw-r--r--src/mongo/idl/basic_types.h107
-rw-r--r--src/mongo/idl/basic_types.idl14
2 files changed, 120 insertions, 1 deletions
diff --git a/src/mongo/idl/basic_types.h b/src/mongo/idl/basic_types.h
new file mode 100644
index 00000000000..8eb66c53629
--- /dev/null
+++ b/src/mongo/idl/basic_types.h
@@ -0,0 +1,107 @@
+/**
+ * Copyright (C) 2019 MongoDB, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the Server Side Public License, version 1,
+ * as published by MongoDB, Inc.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Server Side Public License for more details.
+ *
+ * You should have received a copy of the Server Side Public License
+ * along with this program. If not, see
+ * <http://www.mongodb.com/licensing/server-side-public-license>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the Server Side Public License in all respects for
+ * all of the code used other than as permitted herein. If you modify file(s)
+ * with this exception, you may extend this exception to your version of the
+ * file(s), but you are not obligated to do so. If you do not wish to do so,
+ * delete this exception statement from your version. If you delete this
+ * exception statement from all source files in the program, then also delete
+ * it in the license file.
+ */
+
+#pragma once
+
+#include <boost/optional.hpp>
+
+#include "mongo/base/string_data.h"
+#include "mongo/bson/bsonobjbuilder.h"
+
+namespace mongo {
+
+/**
+ * Wraps a boost::optional<bool> to provide consistent semantics. A standard boost::optional<bool>
+ * can introduce ambiguity because its 'operator bool' will resolve to 'true' if the optional is
+ * populated, even if is populated with boolean 'false'. By contrast, an instance of this class
+ * always resolves to the populated value, or false if not yet populated. This class will also
+ * serialize to BSON via the IDL only if the value has been explicitly set.
+ */
+class OptionalBool {
+public:
+ static OptionalBool parseFromBSON(BSONElement element) {
+ uassert(ErrorCodes::BadValue,
+ str::stream() << "Field '" << element.fieldNameStringData()
+ << "' should be a boolean value, but found: " << element.type(),
+ !element || element.type() == BSONType::Bool);
+ return element ? OptionalBool{element.boolean()} : OptionalBool{};
+ }
+
+ OptionalBool(boost::optional<bool> value) : _value(std::move(value)) {}
+ OptionalBool(bool value) : _value(value) {}
+
+ OptionalBool() : OptionalBool(boost::none) {}
+
+ /**
+ * Returns true only if _value is populated with a value of true.
+ */
+ operator bool() const {
+ return _value.value_or(false);
+ }
+
+ /**
+ * Returns true if the value has been populated, false otherwise.
+ */
+ bool has_value() const {
+ return _value.has_value();
+ }
+
+ /**
+ * Serialize this object as a field in a document. If _value is empty, omit the field.
+ */
+ void serializeToBSON(StringData fieldName, BSONObjBuilder* builder) const {
+ if (_value) {
+ builder->appendBool(fieldName, *_value);
+ }
+ }
+
+ /**
+ * Serialize this object as an element of a BSON array. If _value is empty, omit the entry.
+ */
+ void serializeToBSON(BSONArrayBuilder* builder) const {
+ if (_value) {
+ builder->append(*_value);
+ }
+ }
+
+ /**
+ * Returns a string representation of the current value.
+ */
+ std::string toString() const {
+ return *this ? "1" : "0";
+ }
+ operator std::string() const {
+ return toString();
+ }
+
+private:
+ boost::optional<bool> _value;
+};
+
+} // namespace mongo
diff --git a/src/mongo/idl/basic_types.idl b/src/mongo/idl/basic_types.idl
index 7ebee57fb3f..fda3a56df0d 100644
--- a/src/mongo/idl/basic_types.idl
+++ b/src/mongo/idl/basic_types.idl
@@ -31,6 +31,7 @@ global:
cpp_namespace: "mongo"
cpp_includes:
- "mongo/db/namespace_string.h"
+ - "mongo/idl/basic_types.h"
- "mongo/util/uuid.h"
types:
@@ -92,10 +93,21 @@ types:
cpp_type: bool
deserializer: "mongo::BSONElement::trueValue"
+ optionalBool:
+ bson_serialization_type: any
+ description: "An optional bool type that does not serialize unless explicitly set. Can be
+ used in place of boost::optional<bool> to provide more intuitive semantics,
+ since the standard optional will coerce to true if populated regardless of
+ its internal value."
+ cpp_type: "mongo::OptionalBool"
+ default: "mongo::OptionalBool()"
+ deserializer: "mongo::OptionalBool::parseFromBSON"
+ serializer: "mongo::OptionalBool::serializeToBSON"
+
bindata_generic:
bson_serialization_type: bindata
bindata_subtype: generic
- description: "A BSON bindata of "
+ description: "A BSON bindata of generic sub type"
cpp_type: "std::vector<std::uint8_t>"
deserializer: "mongo::BSONElement::_binDataVector"