From fe5ef2303f53773cabd01e0ce7e7cc83965fe211 Mon Sep 17 00:00:00 2001 From: Benety Goh Date: Thu, 25 Apr 2019 22:52:43 -0400 Subject: Revert "SERVER-40005 Add translation for FindAndModify for FLE" This reverts commit 9318790212dead660f8f057f18ed48fba9232b83. --- src/mongo/db/query/find_and_modify_request.cpp | 109 +++++++++---------------- 1 file changed, 40 insertions(+), 69 deletions(-) (limited to 'src/mongo/db/query/find_and_modify_request.cpp') diff --git a/src/mongo/db/query/find_and_modify_request.cpp b/src/mongo/db/query/find_and_modify_request.cpp index 6c46b639177..1ef84b03762 100644 --- a/src/mongo/db/query/find_and_modify_request.cpp +++ b/src/mongo/db/query/find_and_modify_request.cpp @@ -34,9 +34,7 @@ #include "mongo/base/status_with.h" #include "mongo/bson/bsonobjbuilder.h" #include "mongo/bson/util/bson_extract.h" -#include "mongo/db/command_generic_argument.h" #include "mongo/db/write_concern.h" -#include "mongo/idl/idl_parser.h" namespace mongo { @@ -54,12 +52,6 @@ const char kUpsertField[] = "upsert"; const char kWriteConcernField[] = "writeConcern"; const std::vector emptyArrayFilters{}; - -const std::vector _knownFields{ - FindAndModifyRequest::kBypassDocumentValidationFieldName, - FindAndModifyRequest::kLegacyCommandName, - FindAndModifyRequest::kCommandName, -}; } // unnamed namespace FindAndModifyRequest::FindAndModifyRequest(NamespaceString fullNs, BSONObj query, BSONObj updateObj) @@ -75,12 +67,12 @@ FindAndModifyRequest FindAndModifyRequest::makeUpdate(NamespaceString fullNs, } FindAndModifyRequest FindAndModifyRequest::makeRemove(NamespaceString fullNs, BSONObj query) { - FindAndModifyRequest request(fullNs, query, {}); + FindAndModifyRequest request(fullNs, query, BSONObj()); request._isRemove = true; return request; } -BSONObj FindAndModifyRequest::toBSON(const BSONObj& commandPassthroughFields) const { +BSONObj FindAndModifyRequest::toBSON() const { BSONObjBuilder builder; builder.append(kCmdName, _ns.coll()); @@ -124,77 +116,56 @@ BSONObj FindAndModifyRequest::toBSON(const BSONObj& commandPassthroughFields) co builder.append(kWriteConcernField, _writeConcern->toBSON()); } - IDLParserErrorContext::appendGenericCommandArguments( - commandPassthroughFields, _knownFields, &builder); - return builder.obj(); } StatusWith FindAndModifyRequest::parseFromBSON(NamespaceString fullNs, const BSONObj& cmdObj) { - BSONObj query; - BSONObj fields; - BSONObj updateObj; - BSONObj sort; + BSONObj query = cmdObj.getObjectField(kQueryField); + BSONObj fields = cmdObj.getObjectField(kFieldProjectionField); + BSONObj updateObj = cmdObj.getObjectField(kUpdateField); + BSONObj sort = cmdObj.getObjectField(kSortField); + BSONObj collation; - bool shouldReturnNew = false; - bool isUpsert = false; - bool isRemove = false; - bool isUpdate = false; - bool arrayFiltersSet = false; - std::vector arrayFilters; + { + BSONElement collationElt; + Status collationEltStatus = + bsonExtractTypedField(cmdObj, kCollationField, BSONType::Object, &collationElt); + if (!collationEltStatus.isOK() && (collationEltStatus != ErrorCodes::NoSuchKey)) { + return collationEltStatus; + } + if (collationEltStatus.isOK()) { + collation = collationElt.Obj(); + } + } - for (auto&& field : cmdObj.getFieldNames>()) { - if (field == kQueryField) { - query = cmdObj.getObjectField(kQueryField); - } else if (field == kSortField) { - sort = cmdObj.getObjectField(kSortField); - } else if (field == kRemoveField) { - isRemove = cmdObj[kRemoveField].trueValue(); - } else if (field == kUpdateField) { - updateObj = cmdObj.getObjectField(kUpdateField); - isUpdate = true; - } else if (field == kNewField) { - shouldReturnNew = cmdObj[kNewField].trueValue(); - } else if (field == kFieldProjectionField) { - fields = cmdObj.getObjectField(kFieldProjectionField); - } else if (field == kUpsertField) { - isUpsert = cmdObj[kUpsertField].trueValue(); - } else if (field == kCollationField) { - BSONElement collationElt; - Status collationEltStatus = - bsonExtractTypedField(cmdObj, kCollationField, BSONType::Object, &collationElt); - if (!collationEltStatus.isOK() && (collationEltStatus != ErrorCodes::NoSuchKey)) { - return collationEltStatus; - } - if (collationEltStatus.isOK()) { - collation = collationElt.Obj(); - } - } else if (field == kArrayFiltersField) { - BSONElement arrayFiltersElt; - Status arrayFiltersEltStatus = bsonExtractTypedField( - cmdObj, kArrayFiltersField, BSONType::Array, &arrayFiltersElt); - if (!arrayFiltersEltStatus.isOK() && (arrayFiltersEltStatus != ErrorCodes::NoSuchKey)) { - return arrayFiltersEltStatus; - } - if (arrayFiltersEltStatus.isOK()) { - arrayFiltersSet = true; - for (auto arrayFilter : arrayFiltersElt.Obj()) { - if (arrayFilter.type() != BSONType::Object) { - return {ErrorCodes::TypeMismatch, - str::stream() << "Each array filter must be an object, found " - << arrayFilter.type()}; - } - arrayFilters.push_back(arrayFilter.Obj()); + std::vector arrayFilters; + bool arrayFiltersSet = false; + { + BSONElement arrayFiltersElt; + Status arrayFiltersEltStatus = + bsonExtractTypedField(cmdObj, kArrayFiltersField, BSONType::Array, &arrayFiltersElt); + if (!arrayFiltersEltStatus.isOK() && (arrayFiltersEltStatus != ErrorCodes::NoSuchKey)) { + return arrayFiltersEltStatus; + } + if (arrayFiltersEltStatus.isOK()) { + arrayFiltersSet = true; + for (auto arrayFilter : arrayFiltersElt.Obj()) { + if (arrayFilter.type() != BSONType::Object) { + return {ErrorCodes::TypeMismatch, + str::stream() << "Each array filter must be an object, found " + << arrayFilter.type()}; } + arrayFilters.push_back(arrayFilter.Obj()); } - } else if (!isGenericArgument(field) && - !std::count(_knownFields.begin(), _knownFields.end(), field)) { - return {ErrorCodes::Error(51177), - str::stream() << "BSON field '" << field << "' is an unknown field."}; } } + bool shouldReturnNew = cmdObj[kNewField].trueValue(); + bool isUpsert = cmdObj[kUpsertField].trueValue(); + bool isRemove = cmdObj[kRemoveField].trueValue(); + bool isUpdate = cmdObj.hasField(kUpdateField); + if (!isRemove && !isUpdate) { return {ErrorCodes::FailedToParse, "Either an update or remove=true must be specified"}; } -- cgit v1.2.1