private BulkWriteResult <BsonDocument> ParseResult(BsonDocument result, out Dictionary <int, int> expectedInsertedIds) { VerifyFields(result, "deletedCount", "insertedCount", "insertedIds", "matchedCount", "modifiedCount", "upsertedCount", "upsertedIds"); var deletedCount = result["deletedCount"].ToInt64(); var insertedCount = result["insertedCount"].ToInt64(); expectedInsertedIds = result["insertedIds"] .AsBsonDocument .ToDictionary(k => Convert.ToInt32(k.Name), v => v.Value.ToInt32()); var matchedCount = result["matchedCount"].ToInt64(); var modifiedCount = result["modifiedCount"].ToInt64(); var processedRequests = new List <WriteModel <BsonDocument> >(_requests); var requestCount = _requests.Count(); var upsertedCount = result.GetValue("upsertedCount", 0).ToInt32(); var upserts = new List <BulkWriteUpsert>(); if (result.Contains("upsertedIds")) { foreach (var element in result["upsertedIds"].AsBsonDocument.Elements) { var index = int.Parse(element.Name, NumberFormatInfo.InvariantInfo); var id = element.Value; var upsert = new BulkWriteUpsert(index, id); upserts.Add(upsert); } } upserts.Count.Should().Be(upsertedCount); return(new BulkWriteResult <BsonDocument> .Acknowledged(requestCount, matchedCount, deletedCount, insertedCount, modifiedCount, processedRequests, upserts)); }
protected override BulkWriteResult <BsonDocument> ConvertExpectedResult(BsonValue expectedResult) { int requestCount = _requests.Count; long matchedCount = 0; long deletedCount = 0; long insertedCount = 0; long?modifiedCount = null; long upsertedCount = 0; List <BulkWriteUpsert> upserts = new List <BulkWriteUpsert>(); foreach (var element in expectedResult.AsBsonDocument) { switch (element.Name) { case "deletedCount": deletedCount = element.Value.ToInt64(); break; case "insertedCount": insertedCount = element.Value.ToInt64(); break; case "insertedIds": break; case "matchedCount": matchedCount = element.Value.ToInt64(); break; case "modifiedCount": modifiedCount = element.Value.ToInt64(); break; case "upsertedCount": upsertedCount = element.Value.ToInt64(); break; case "upsertedIds": foreach (var upsertedId in element.Value.AsBsonDocument.Elements) { var index = int.Parse(upsertedId.Name); var id = upsertedId.Value; var upsert = new BulkWriteUpsert(index, id); upserts.Add(upsert); } break; default: throw new ArgumentException($"Unexpected result field: \"{element.Name}\"."); } } if (upserts.Count != upsertedCount) { throw new FormatException("upsertedIds count != upsertedCount"); } return(new BulkWriteResult <BsonDocument> .Acknowledged(requestCount, matchedCount, deletedCount, insertedCount, modifiedCount, _requests, upserts)); }
public void OneTimeSetUp() { _connectionId = new ConnectionId(new ServerId(new ClusterId(1), new DnsEndPoint("localhost", 27017)), 2); var processedRequests = new[] { new InsertOneModel <BsonDocument>(new BsonDocument("b", 1)) }; var upserts = new BulkWriteUpsert[0]; _bulkWriteResult = new BulkWriteResult <BsonDocument> .Acknowledged(1, 1, 0, 0, 0, processedRequests, upserts); _writeConcernError = new WriteConcernError(11, "funny", new BsonDocument("c", 1)); _writeErrors = new[] { new BulkWriteError(10, ServerErrorCategory.Uncategorized, 1, "blah", new BsonDocument("a", 1)) }; _unprocessedRequests = new[] { new InsertOneModel <BsonDocument>(new BsonDocument("a", 1)) }; }
public void Constructor_should_work() { var processedRequests = new WriteRequest[0]; var upserts = new BulkWriteUpsert[0]; var result = new AcknowledgedBulkWriteResult(1, 2, 3, 4, 5, processedRequests, upserts); var writeErrors = new BulkWriteError[0]; var writeConcernError = new WriteConcernError(1, "message", new BsonDocument("x", 1)); var unprocessedRequests = new WriteRequest[0]; var subject = new BulkWriteException(result, writeErrors, writeConcernError, unprocessedRequests); subject.Result.Should().BeSameAs(result); subject.UnprocessedRequests.Should().BeSameAs(unprocessedRequests); subject.WriteConcernError.Should().BeSameAs(writeConcernError); subject.WriteErrors.Should().BeSameAs(writeErrors); }
private static IList <BulkWriteUpsert> CreateUpserts(BsonDocument writeCommandResponse) { var upserts = new List <BulkWriteUpsert>(); if (writeCommandResponse.Contains("upserted")) { foreach (BsonDocument value in writeCommandResponse["upserted"].AsBsonArray) { var index = value["index"].ToInt32(); var id = value["_id"]; var upsert = new BulkWriteUpsert(index, id); upserts.Add(upsert); } } return(upserts); }
public void Serialization_should_drop_custom_fields() { var processedRequests = new WriteRequest[0]; var upserts = new BulkWriteUpsert[0]; var result = new AcknowledgedBulkWriteResult(1, 2, 3, 4, 5, processedRequests, upserts); var writeErrors = new BulkWriteError[0]; var writeConcernError = new WriteConcernError(1, "message", new BsonDocument("x", 1)); var unprocessedRequests = new WriteRequest[0]; var subject = new BulkWriteException(result, writeErrors, writeConcernError, unprocessedRequests); var formatter = new BinaryFormatter(); using (var stream = new MemoryStream()) { formatter.Serialize(stream, subject); stream.Position = 0; var rehydrated = (BulkWriteException)formatter.Deserialize(stream); rehydrated.Result.Should().BeNull(); rehydrated.UnprocessedRequests.Should().BeNull(); rehydrated.WriteConcernError.Should().BeNull(); rehydrated.WriteErrors.Should().BeNull(); } }
private bool UpsertEquals(BulkWriteUpsert x, BulkWriteUpsert y) { return(x.Index == y.Index && x.Id.Equals(y.Id)); }
// private methods private WriteConcernResult ToWriteConcernResult(BulkWriteResult bulkWriteResult, BulkWriteException bulkWriteException) { if (!bulkWriteResult.IsAcknowledged) { return(null); } // don't include InsertedCount in getLastErrorResponse var documentsAffectedCount = bulkWriteResult.DeletedCount + bulkWriteResult.MatchedCount + bulkWriteResult.Upserts.Count; var isUpdate = bulkWriteResult.ProcessedRequests.Any(r => r.RequestType == WriteRequestType.Update); var updatedExisting = false; BulkWriteUpsert upsert = null; if (isUpdate) { upsert = bulkWriteResult.Upserts.LastOrDefault(); updatedExisting = documentsAffectedCount > 0 && upsert == null; } var code = 0; string message = null; BsonDocument details = null; if (bulkWriteException != null) { var lastWriteError = bulkWriteException.WriteErrors.LastOrDefault(); var writeConcernError = bulkWriteException.WriteConcernError; code = 8; // UnknownError if (lastWriteError != null) { code = lastWriteError.Code; message = lastWriteError.Message; details = lastWriteError.Details; } else if (writeConcernError != null) { code = writeConcernError.Code; message = writeConcernError.Message; details = writeConcernError.Details; } } var getLastErrorResponse = new BsonDocument { { "ok", 1 }, { "code", code, code != 0 }, { "err", message, message != null }, { "n", documentsAffectedCount }, { "updatedExisting", updatedExisting, isUpdate }, { "upserted", () => upsert.Id, isUpdate&& upsert != null }, }; getLastErrorResponse.Merge(details, false); // don't overwrite existing elements return(new WriteConcernResult(getLastErrorResponse)); }
public static bool Equals(BulkWriteUpsert x, BulkWriteUpsert y) { return (object.Equals(x.Id, x.Id) && x.Index == y.Index); }