コード例 #1
0
        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));
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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)) };
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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();
            }
        }
コード例 #7
0
 private bool UpsertEquals(BulkWriteUpsert x, BulkWriteUpsert y)
 {
     return(x.Index == y.Index && x.Id.Equals(y.Id));
 }
コード例 #8
0
        // 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));
        }
コード例 #9
0
 public static bool Equals(BulkWriteUpsert x, BulkWriteUpsert y)
 {
     return
         (object.Equals(x.Id, x.Id) &&
          x.Index == y.Index);
 }