| 1423 | }; |
| 1424 | |
| 1425 | struct ExtSimpleUpsert : ConcreteInsertOp<ExtSimpleUpsert> { |
| 1426 | bson::BSONObj selector; |
| 1427 | bson::BSONObj update; |
| 1428 | |
| 1429 | ExtSimpleUpsert(bson::BSONObj selector, bson::BSONObj update) : selector(selector), update(update) {} |
| 1430 | |
| 1431 | std::string describe() override { return "SimpleUpsert(" + selector.toString() + "," + update.toString() + ")"; } |
| 1432 | |
| 1433 | Future<Reference<IReadWriteContext>> insert(Reference<CollectionContext> cx) override { |
| 1434 | Optional<IdInfo> encodedIds = extractEncodedIds(selector); |
| 1435 | Optional<IdInfo> updateIds = extractEncodedIds(update); |
| 1436 | if (!encodedIds.present()) { |
| 1437 | encodedIds = updateIds; |
| 1438 | } else if (updateIds.present() && updateIds.get().keyEncoded != encodedIds.get().keyEncoded) { |
| 1439 | throw cant_modify_id(); |
| 1440 | } |
| 1441 | return insertDocument(cx, update, encodedIds); |
| 1442 | } |
| 1443 | }; |
| 1444 | |
| 1445 | Reference<IUpdateOp> operatorUpdate(bson::BSONObj const& msgUpdate) { |
| 1446 | return ref(new ExtOperatorUpdate(msgUpdate)); |
nothing calls this directly
no outgoing calls
no test coverage detected