// private methods
        private BulkWriteBatchResult ExecuteBatch(MongoConnection connection, Run run)
        {
            BulkWriteResult    result;
            BulkWriteException exception = null;

            try
            {
                switch (run.RequestType)
                {
                case WriteRequestType.Delete:
                    result = ExecuteDeletes(connection, run.Requests.Cast <DeleteRequest>());
                    break;

                case WriteRequestType.Insert:
                    result = ExecuteInserts(connection, run.Requests.Cast <InsertRequest>());
                    break;

                case WriteRequestType.Update:
                    result = ExecuteUpdates(connection, run.Requests.Cast <UpdateRequest>());
                    break;

                default:
                    throw new MongoInternalException("Unrecognized RequestType.");
                }
            }
            catch (BulkWriteException ex)
            {
                result    = ex.Result;
                exception = ex;
            }

            return(BulkWriteBatchResult.Create(result, exception, run.IndexMap));
        }
Exemple #2
0
        public void Should_convert_from_core_exception_with_a_write_concern_error_when_original_models_do_not_exist()
        {
            var exception = new BulkWriteOperationException(
                result: new BulkWriteOperationResult.Acknowledged(
                    requestCount: 1,
                    matchedCount: 1,
                    deletedCount: 0,
                    insertedCount: 0,
                    modifiedCount: 0,
                    processedRequests: new[] { new InsertRequest(new BsonDocumentWrapper(new BsonDocument("b", 1)))
                                               {
                                                   CorrelationId = 1
                                               } },
                    upserts: new List <BulkWriteOperationUpsert>()),
                writeErrors: new[] { new BulkWriteOperationError(10, 1, "blah", new BsonDocument("a", 1)) },
                writeConcernError: new BulkWriteConcernError(11, "funny", new BsonDocument("c", 1)),
                unprocessedRequests: new[] { new InsertRequest(new BsonDocumentWrapper(new BsonDocument("a", 1)))
                                             {
                                                 CorrelationId = 0
                                             } });

            var mapped = BulkWriteException <BsonDocument> .FromCore(exception);

            mapped.Result.ProcessedRequests.Count.Should().Be(1);
            mapped.Result.ProcessedRequests[0].Should().BeOfType <InsertOneModel <BsonDocument> >();
            ((InsertOneModel <BsonDocument>)mapped.Result.ProcessedRequests[0]).Document.Should().Be("{b:1}");
            mapped.WriteConcernError.Should().NotBeNull();
            mapped.WriteErrors.Count.Should().Be(1);
            mapped.WriteErrors[0].Should().NotBeNull();
            mapped.UnprocessedRequests.Count.Should().Be(1);
            mapped.UnprocessedRequests[0].Should().BeOfType <InsertOneModel <BsonDocument> >();
            ((InsertOneModel <BsonDocument>)mapped.UnprocessedRequests[0]).Document.Should().Be("{a:1}");
        }
        // public methods
        public Exception ToWriteConcernException(MongoServerInstance serverInstance, BulkWriteException bulkWriteException)
        {
            var writeConcernResult = ToWriteConcernResult(bulkWriteException.Result, bulkWriteException);

            writeConcernResult.ServerInstance = serverInstance;

            var exception = ExceptionMapper.Map(writeConcernResult.Response);

            if (exception == null)
            {
                exception = ExceptionMapper.Map(writeConcernResult);
            }
            if (exception == null)
            {
                exception = new WriteConcernException(bulkWriteException.Message, writeConcernResult);
            }

            var writeConcernException = exception as WriteConcernException;

            if (writeConcernException != null)
            {
                writeConcernException.Data["results"] = new List <WriteConcernResult>(new[] { writeConcernResult });
            }

            return(exception); // usually a WriteConcernException unless ExceptionMapper chose a different type
        }
        // 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);
        }
 protected override void When()
 {
     var subject = new BulkMixedWriteOperation(DatabaseName, CollectionName, _requests)
     {
         IsOrdered = false
     };
     _exception = Catch<BulkWriteException>(() => ExecuteOperationAsync(subject).GetAwaiter().GetResult());
 }
Exemple #6
0
        protected override void When()
        {
            var subject = new BulkMixedWriteOperation(DatabaseName, CollectionName, _requests)
            {
                IsOrdered = true
            };

            _exception = Catch <BulkWriteException>(() => ExecuteOperationAsync(subject).GetAwaiter().GetResult());
        }
        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);
        }
Exemple #8
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);
        }
        // public static methods
        public static BulkWriteBatchResult Create(
            BulkWriteResult result,
            BulkWriteException exception,
            IndexMap indexMap)
        {
            var  matchedCount  = 0L;
            var  deletedCount  = 0L;
            var  insertedCount = 0L;
            long?modifiedCount = null;
            var  upserts       = Enumerable.Empty <BulkWriteUpsert>();

            if (result.IsAcknowledged)
            {
                matchedCount  = result.MatchedCount;
                deletedCount  = result.DeletedCount;
                insertedCount = result.InsertedCount;
                modifiedCount = result.IsModifiedCountAvailable ? (long?)result.ModifiedCount : null;
                upserts       = result.Upserts;
            }

            var unprocessedRequests             = __noWriteRequests;
            var writeErrors                     = __noWriteErrors;
            WriteConcernError writeConcernError = null;

            if (exception != null)
            {
                unprocessedRequests = exception.UnprocessedRequests;
                writeErrors         = exception.WriteErrors;
                writeConcernError   = exception.WriteConcernError;
            }

            return(new BulkWriteBatchResult(
                       result.RequestCount,
                       result.ProcessedRequests,
                       unprocessedRequests,
                       matchedCount,
                       deletedCount,
                       insertedCount,
                       modifiedCount,
                       upserts,
                       writeErrors,
                       writeConcernError,
                       indexMap,
                       null));
        }
        // public methods
        public WriteConcernResult Execute(MongoConnection connection)
        {
            var serverInstance = connection.ServerInstance;

            if (!serverInstance.Supports(FeatureId.WriteCommands))
            {
                throw new NotSupportedException("Write commands are not supported.");
            }

            var operation = new BulkUpdateOperation(_args);

            BulkWriteResult    bulkWriteResult;
            BulkWriteException bulkWriteException = null;

            try
            {
                bulkWriteResult = operation.Execute(connection);
            }
            catch (BulkWriteException ex)
            {
                bulkWriteResult    = ex.Result;
                bulkWriteException = ex;
            }

            var converter = new BulkWriteResultConverter();

            if (bulkWriteException != null)
            {
                throw converter.ToWriteConcernException(bulkWriteException);
            }
            else
            {
                if (_args.WriteConcern.Enabled)
                {
                    return(converter.ToWriteConcernResult(bulkWriteResult));
                }
                else
                {
                    return(null);
                }
            }
        }
        // public methods
        public Exception ToWriteConcernException(BulkWriteException bulkWriteException)
        {
            var writeConcernResult = ToWriteConcernResult(bulkWriteException.Result, bulkWriteException);

            var exception = ExceptionMapper.Map(writeConcernResult.Response);
            if (exception == null)
            {
                exception = ExceptionMapper.Map(writeConcernResult);
            }
            if (exception == null)
            {
                exception = new WriteConcernException(bulkWriteException.Message, writeConcernResult);
            }

            var writeConcernException = exception as WriteConcernException;
            if (writeConcernException != null)
            { 
                writeConcernException.Data["results"] = new List<WriteConcernResult>(new[] { writeConcernResult });
            }

            return exception; // usually a WriteConcernException unless ExceptionMapper chose a different type
        }
        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();
            }
        }
Exemple #13
0
        private async Task <BulkWriteBatchResult> ExecuteBatchAsync(IConnectionHandle connection, Run run, TimeSpan timeout, CancellationToken cancellationToken)
        {
            BulkWriteResult    result;
            BulkWriteException exception = null;

            try
            {
                switch (run.RequestType)
                {
                case WriteRequestType.Delete:
                    result = await ExecuteDeletesAsync(connection, run.Requests.Cast <DeleteRequest>(), timeout, cancellationToken);

                    break;

                case WriteRequestType.Insert:
                    result = await ExecuteInsertsAsync(connection, run.Requests.Cast <InsertRequest>(), timeout, cancellationToken);

                    break;

                case WriteRequestType.Update:
                    result = await ExecuteUpdatesAsync(connection, run.Requests.Cast <UpdateRequest>(), timeout, cancellationToken);

                    break;

                default:
                    throw new InternalException("Unrecognized RequestType.");
                }
            }
            catch (BulkWriteException ex)
            {
                result    = ex.Result;
                exception = ex;
            }

            return(BulkWriteBatchResult.Create(result, exception, run.IndexMap));
        }
Exemple #14
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();
            }
        }
 private void WriteErrors(BulkWriteException exception)
 {
     exception.WriteErrors
     .ToList()
     .ForEach(e => Console.WriteLine(e.Message));
 }
        // 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 BulkWriteBatchResult Create(
           BulkWriteResult result,
           BulkWriteException exception,
           IndexMap indexMap)
        {
            var matchedCount = 0L;
            var deletedCount = 0L;
            var insertedCount = 0L;
            long? modifiedCount = null;
            var upserts = __noUpserts;
            if (result.IsAcknowledged)
            {
                matchedCount = result.MatchedCount;
                deletedCount = result.DeletedCount;
                insertedCount = result.InsertedCount;
                modifiedCount = result.IsModifiedCountAvailable ? (long?)result.ModifiedCount : null;
                upserts = result.Upserts;
            }

            var unprocessedRequests = __noWriteRequests;
            var writeErrors = __noWriteErrors;
            WriteConcernError writeConcernError = null;
            if (exception != null)
            {
                unprocessedRequests = exception.UnprocessedRequests;
                writeErrors = exception.WriteErrors;
                writeConcernError = exception.WriteConcernError;
            }

            return new BulkWriteBatchResult(
                result.RequestCount,
                result.ProcessedRequests,
                unprocessedRequests,
                matchedCount,
                deletedCount,
                insertedCount,
                modifiedCount,
                upserts,
                writeErrors,
                writeConcernError,
                indexMap);
        }