| 696 | }; |
| 697 | |
| 698 | struct ExtIndexInsert : ConcreteInsertOp<ExtIndexInsert> { |
| 699 | bson::BSONObj indexObj; |
| 700 | std::string ns; |
| 701 | UID build_id; |
| 702 | |
| 703 | ExtIndexInsert(bson::BSONObj indexObj, UID build_id, std::string ns) |
| 704 | : indexObj(indexObj), build_id(build_id), ns(ns) {} |
| 705 | |
| 706 | std::string describe() override { return "IndexInsert(" + indexObj.toString() + ")"; } |
| 707 | |
| 708 | ACTOR static Future<Reference<IReadWriteContext>> indexInsertActor(ExtIndexInsert* self, |
| 709 | Reference<CollectionContext> cx) { |
| 710 | state Standalone<StringRef> encodedId; |
| 711 | state Standalone<StringRef> valueEncodedId; |
| 712 | state Optional<bson::BSONObj> idObj; |
| 713 | state Reference<QueryContext> dcx; |
| 714 | |
| 715 | Optional<IdInfo> encodedIds = extractEncodedIds(self->indexObj); |
| 716 | |
| 717 | if (!encodedIds.present()) { |
| 718 | encodedId = DataValue(bson::OID::gen()).encode_key_part(); |
| 719 | valueEncodedId = encodedId; |
| 720 | idObj = Optional<bson::BSONObj>(); |
| 721 | dcx = cx->cx->getSubContext(encodedId); |
| 722 | } else { |
| 723 | encodedId = encodedIds.get().keyEncoded; |
| 724 | valueEncodedId = encodedIds.get().valueEncoded; |
| 725 | idObj = encodedIds.get().objValue; |
| 726 | dcx = cx->cx->getSubContext(encodedId); |
| 727 | Optional<DataValue> existing = |
| 728 | wait(dcx->get(DataValue(DocLayerConstants::ID_FIELD, DVTypeCode::STRING).encode_key_part())); |
| 729 | if (existing.present()) |
| 730 | throw duplicated_key_field(); |
| 731 | } |
| 732 | |
| 733 | // FIXME: abstraction violation out of laziness |
| 734 | Key prefix = StringRef(dcx->getPrefix().toString()); |
| 735 | dcx->getTransaction()->tr->addWriteConflictRange(KeyRangeRef(prefix, strinc(prefix))); |
| 736 | |
| 737 | dcx->set(LiteralStringRef(""), DataValue::subObject().encode_value()); |
| 738 | |
| 739 | dcx->set(DataValue(DocLayerConstants::NS_FIELD, DVTypeCode::STRING).encode_key_part(), |
| 740 | DataValue(self->ns).encode_value()); |
| 741 | dcx->set( |
| 742 | DataValue(DocLayerConstants::NAME_FIELD, DVTypeCode::STRING).encode_key_part(), |
| 743 | DataValue(self->indexObj.getStringField(DocLayerConstants::NAME_FIELD), DVTypeCode::STRING).encode_value()); |
| 744 | dcx->set(DataValue(DocLayerConstants::KEY_FIELD, DVTypeCode::STRING).encode_key_part(), |
| 745 | DataValue(self->indexObj.getObjectField(DocLayerConstants::KEY_FIELD)).encode_value()); |
| 746 | dcx->set(DataValue(DocLayerConstants::STATUS_FIELD, DVTypeCode::STRING).encode_key_part(), |
| 747 | DataValue(DocLayerConstants::INDEX_STATUS_BUILDING, DVTypeCode::STRING).encode_value()); |
| 748 | dcx->set(DataValue(DocLayerConstants::METADATA_VERSION_FIELD, DVTypeCode::STRING).encode_key_part(), |
| 749 | DataValue(1).encode_value()); |
| 750 | dcx->set(DataValue(DocLayerConstants::BUILD_ID_FIELD, DVTypeCode::STRING).encode_key_part(), |
| 751 | DataValue(self->build_id.toString()).encode_value()); |
| 752 | dcx->set(DataValue(DocLayerConstants::UNIQUE_FIELD, DVTypeCode::STRING).encode_key_part(), |
| 753 | DataValue(self->indexObj.getBoolField(DocLayerConstants::UNIQUE_FIELD)).encode_value()); |
| 754 | dcx->set(DataValue(DocLayerConstants::BACKGROUND_FIELD, DVTypeCode::STRING).encode_key_part(), |
| 755 | DataValue(self->indexObj.getBoolField(DocLayerConstants::BACKGROUND_FIELD)).encode_value()); |
nothing calls this directly
no outgoing calls
no test coverage detected