// static methods
        public static BulkWriteBatchResult Create(
            bool isOrdered,
            IReadOnlyList <WriteRequest> requests,
            BsonDocument writeCommandResponse,
            IndexMap indexMap,
            MongoWriteConcernException writeConcernException)
        {
            var writeErrors         = CreateWriteErrors(writeCommandResponse);
            var writeConcernError   = CreateWriteConcernError(writeCommandResponse, writeConcernException);
            var processedRequests   = CreateProcessedRequests(requests, writeErrors, isOrdered);
            var unprocessedRequests = CreateUnprocessedRequests(requests, writeErrors, isOrdered);
            var upserts             = CreateUpserts(writeCommandResponse);

            var  n             = writeCommandResponse == null ? 0 : writeCommandResponse.GetValue("n", 0).ToInt64();
            var  matchedCount  = 0L;
            var  deletedCount  = 0L;
            var  insertedCount = 0L;
            long?modifiedCount = 0L;
            var  firstRequest  = requests.FirstOrDefault();

            if (firstRequest != null)
            {
                switch (firstRequest.RequestType)
                {
                case WriteRequestType.Delete:
                    deletedCount = n;
                    break;

                case WriteRequestType.Insert:
                    insertedCount = n;
                    break;

                case WriteRequestType.Update:
                    matchedCount = n - upserts.Count();
                    BsonValue nModified;
                    if (writeCommandResponse != null && writeCommandResponse.TryGetValue("nModified", out nModified))
                    {
                        modifiedCount = nModified.ToInt64();
                    }
                    else
                    {
                        modifiedCount = null;
                    }
                    break;
                }
            }

            return(new BulkWriteBatchResult(
                       requests.Count,
                       processedRequests,
                       unprocessedRequests,
                       matchedCount,
                       deletedCount,
                       insertedCount,
                       modifiedCount,
                       upserts,
                       writeErrors,
                       writeConcernError,
                       indexMap));
        }
示例#2
0
        protected static Exception HandleWriteException(MongoWriteConcernException exception)
        {
            switch (exception.Code)
            {
            case 11000:
            case 11001:
                throw new ConflictException(exception.ErrorMessage, exception);
            }

            return(new InternalServerErrorException(exception));
        }
        // private methods
        private BulkWriteBatchResult CreateBatchResult(
            Batch batch,
            BsonDocument writeCommandResult,
            MongoWriteConcernException writeConcernException)
        {
            var requests        = batch.Requests;
            var requestsInBatch = requests.GetProcessedItems();
            var indexMap        = new IndexMap.RangeBased(0, requests.Offset, requests.Count);

            return(BulkWriteBatchResult.Create(
                       _isOrdered,
                       requestsInBatch,
                       writeCommandResult,
                       indexMap,
                       writeConcernException));
        }
        public static MongoCommandException CreateMongoWriteConcernException(BsonDocument writeConcernResultDocument, string label = null)
        {
            var clusterId             = new ClusterId(1);
            var endPoint              = new DnsEndPoint("localhost", 27017);
            var serverId              = new ServerId(clusterId, endPoint);
            var connectionId          = new ConnectionId(serverId);
            var message               = "Fake MongoWriteConcernException";
            var writeConcernResult    = new WriteConcernResult(writeConcernResultDocument);
            var writeConcernException = new MongoWriteConcernException(connectionId, message, writeConcernResult);

            if (label != null)
            {
                writeConcernException.AddErrorLabel(label);
            }

            return(writeConcernException);
        }
示例#5
0
        private async Task <BulkWriteBatchResult> EmulateSingleRequestAsync(IChannelHandle channel, TWriteRequest request, int originalIndex, CancellationToken cancellationToken)
        {
            WriteConcernResult         writeConcernResult    = null;
            MongoWriteConcernException writeConcernException = null;

            try
            {
                writeConcernResult = await ExecuteProtocolAsync(channel, request, cancellationToken).ConfigureAwait(false);
            }
            catch (MongoWriteConcernException ex)
            {
                writeConcernResult    = ex.WriteConcernResult;
                writeConcernException = ex;
            }

            return(CreateSingleRequestResult(request, originalIndex, writeConcernResult, writeConcernException));
        }
示例#6
0
        // private methods
        private BulkWriteBatchResult EmulateSingleRequest(IChannelHandle channel, TWriteRequest request, int originalIndex, CancellationToken cancellationToken)
        {
            WriteConcernResult         writeConcernResult    = null;
            MongoWriteConcernException writeConcernException = null;

            try
            {
                writeConcernResult = ExecuteProtocol(channel, request, cancellationToken);
            }
            catch (MongoWriteConcernException ex)
            {
                writeConcernResult    = ex.WriteConcernResult;
                writeConcernException = ex;
            }

            return(CreateSingleRequestResult(request, originalIndex, writeConcernResult, writeConcernException));
        }
示例#7
0
            public WriteConcernResult HandleException(MongoWriteConcernException exception)
            {
                var result = exception.WriteConcernResult;

                if (_continueOnError)
                {
                    _finalException = exception;
                }
                else if (_writeConcern.IsAcknowledged)
                {
                    _results.Add(result);
                    exception.Data["results"] = _results;
                    throw exception;
                }

                return(result);
            }
        private static BulkWriteConcernError CreateWriteConcernError(
            BsonDocument writeCommandResponse,
            MongoWriteConcernException writeConcernException)
        {
            if (writeCommandResponse != null && writeCommandResponse.Contains("writeConcernError"))
            {
                var value       = (BsonDocument)writeCommandResponse["writeConcernError"];
                var code        = value["code"].ToInt32();
                var codeName    = (string)value.GetValue("codeName", null);
                var message     = value["errmsg"].AsString;
                var details     = (BsonDocument)value.GetValue("errInfo", null);
                var errorLabels = writeConcernException.ErrorLabels;

                return(new BulkWriteConcernError(code, codeName, message, details, errorLabels));
            }

            return(null);
        }
        private BulkWriteBatchResult ExecuteBatch(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken)
        {
            var          operation = CreateBatchOperation(batch);
            BsonDocument operationResult;
            MongoWriteConcernException writeConcernException = null;

            try
            {
                operationResult = RetryableWriteOperationExecutor.Execute(operation, context, cancellationToken);
            }
            catch (MongoWriteConcernException exception) when(exception.IsWriteConcernErrorOnly())
            {
                operationResult       = exception.Result;
                writeConcernException = exception;
            }

            return(CreateBatchResult(batch, operationResult, writeConcernException));
        }
        private async Task <BulkWriteBatchResult> ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken)
        {
            var          operation = CreateBatchOperation(batch);
            BsonDocument operationResult;
            MongoWriteConcernException writeConcernException = null;

            try
            {
                operationResult = await RetryableWriteOperationExecutor.ExecuteAsync(operation, context, cancellationToken).ConfigureAwait(false);
            }
            catch (MongoWriteConcernException exception) when(exception.IsWriteConcernErrorOnly())
            {
                operationResult       = exception.Result;
                writeConcernException = exception;
            }

            return(CreateBatchResult(batch, operationResult, writeConcernException));
        }
        // public methods
        public Exception ToWriteConcernException(ConnectionId connectionId, MongoBulkWriteOperationException bulkWriteException)
        {
            var writeConcernResult = ToWriteConcernResult(bulkWriteException.Result, bulkWriteException);

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

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

            return exception; // usually a WriteConcernException unless ExceptionMapper chose a different type
        }
示例#12
0
        internal void ShouldInvalidateServer_should_return_expected_result_for_MongoWriteConcernException(ServerErrorCode?code, string message, bool expectedResult)
        {
            _subject.Initialize();
            var clusterId     = new ClusterId(1);
            var serverId      = new ServerId(clusterId, new DnsEndPoint("localhost", 27017));
            var connectionId  = new ConnectionId(serverId);
            var command       = new BsonDocument("command", 1);
            var commandResult = new BsonDocument
            {
                { "ok", 1 },
                { "writeConcernError", new BsonDocument
                  {
                      { "code", () => (int)code.Value, code.HasValue },
                      { "errmsg", message, message != null }
                  } }
            };
            var writeConcernResult = new WriteConcernResult(commandResult);
            var exception          = new MongoWriteConcernException(connectionId, "message", writeConcernResult);

            var result = _subject.ShouldInvalidateServer(Mock.Of <IConnection>(), exception, new ServerDescription(_subject.ServerId, _subject.EndPoint), out _);

            result.Should().Be(expectedResult);
        }
示例#13
0
        // methods
        protected virtual async Task <BulkWriteBatchResult> EmulateSingleRequestAsync(IChannelHandle channel, WriteRequest request, int originalIndex, CancellationToken cancellationToken)
        {
            WriteConcernResult         writeConcernResult    = null;
            MongoWriteConcernException writeConcernException = null;

            try
            {
                writeConcernResult = await ExecuteProtocolAsync(channel, request, cancellationToken).ConfigureAwait(false);
            }
            catch (MongoWriteConcernException ex)
            {
                writeConcernResult    = ex.WriteConcernResult;
                writeConcernException = ex;
            }

            var indexMap = new IndexMap.RangeBased(0, originalIndex, 1);

            return(BulkWriteBatchResult.Create(
                       request,
                       writeConcernResult,
                       writeConcernException,
                       indexMap));
        }
示例#14
0
        // public methods
        public Exception ToWriteConcernException(ConnectionId connectionId, MongoBulkWriteOperationException bulkWriteException)
        {
            var writeConcernResult = ToWriteConcernResult(bulkWriteException.Result, bulkWriteException);

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

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

            var writeConcernException = exception as MongoWriteConcernException;

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

            return(exception); // usually a WriteConcernException unless ExceptionMapper chose a different type
        }
        public static BulkWriteBatchResult Create(
            WriteRequest request,
            WriteConcernResult writeConcernResult,
            MongoWriteConcernException writeConcernException,
            IndexMap indexMap)
        {
            var processedRequests = new[] { request };
            var unprocessedRequests = __noWriteRequests;
            BsonValue upsertId = null;
            var documentsAffected = 0L;

            if (writeConcernResult != null)
            {
                upsertId = writeConcernResult.Upserted;
                documentsAffected = writeConcernResult.DocumentsAffected;
                var updateRequest = request as UpdateRequest;

                if (upsertId == null &&
                    documentsAffected == 1 &&
                    updateRequest != null &&
                    updateRequest.IsUpsert &&
                    !writeConcernResult.UpdatedExisting)
                {
                    // Get the _id field first from the Update document
                    // and then from the Query document.
                    upsertId =
                        updateRequest.Update.ToBsonDocument().GetValue("_id", null) ??
                        updateRequest.Filter.ToBsonDocument().GetValue("_id", null);
                }
            }

            var upserts = (upsertId == null) ? __noUpserts : new[] { new BulkWriteOperationUpsert(0, upsertId) };
            var writeErrors = __noWriteErrors;
            BulkWriteConcernError writeConcernError = null;

            if (writeConcernException != null)
            {
                var getLastErrorResponse = writeConcernResult.Response;
                if (IsGetLasterrorResponseAWriteConcernError(getLastErrorResponse))
                {
                    writeConcernError = CreateWriteConcernErrorFromGetLastErrorResponse(getLastErrorResponse);
                }
                else
                {
                    writeErrors = new[] { CreateWriteErrorFromGetLastErrorResponse(getLastErrorResponse) };
                }
            }

            if (request.RequestType == WriteRequestType.Insert && writeErrors.Count == 0)
            {
                documentsAffected = 1; // note: DocumentsAffected is 0 for inserts
            }

            var matchedCount = 0L;
            var deletedCount = 0L;
            var insertedCount = 0L;
            long? modifiedCount = 0L;
            switch (request.RequestType)
            {
                case WriteRequestType.Delete:
                    deletedCount = documentsAffected;
                    break;
                case WriteRequestType.Insert:
                    insertedCount = documentsAffected;
                    break;
                case WriteRequestType.Update:
                    matchedCount = documentsAffected - upserts.Count();
                    modifiedCount = null; // getLasterror does not report this value
                    break;
            }

            return new BulkWriteBatchResult(
                1, // batchCount
                processedRequests,
                unprocessedRequests,
                matchedCount,
                deletedCount,
                insertedCount,
                modifiedCount,
                upserts,
                writeErrors,
                writeConcernError,
                indexMap);
        }
示例#16
0
        private BulkWriteBatchResult CreateSingleRequestResult(TWriteRequest request, int originalIndex, WriteConcernResult writeConcernResult, MongoWriteConcernException writeConcernException)
        {
            var indexMap = new IndexMap.RangeBased(0, originalIndex, 1);

            return(BulkWriteBatchResult.Create(
                       request,
                       writeConcernResult,
                       writeConcernException,
                       indexMap));
        }
 private BulkWriteBatchResult CreateSingleRequestResult(WriteRequest request, int originalIndex, WriteConcernResult writeConcernResult, MongoWriteConcernException writeConcernException)
 {
     var indexMap = new IndexMap.RangeBased(0, originalIndex, 1);
     return BulkWriteBatchResult.Create(
         request,
         writeConcernResult,
         writeConcernException,
         indexMap);
 }
        public static BulkWriteBatchResult Create(
            WriteRequest request,
            WriteConcernResult writeConcernResult,
            MongoWriteConcernException writeConcernException,
            IndexMap indexMap)
        {
            var       processedRequests   = new[] { request };
            var       unprocessedRequests = __noWriteRequests;
            BsonValue upsertId            = null;
            var       documentsAffected   = 0L;

            if (writeConcernResult != null)
            {
                upsertId          = writeConcernResult.Upserted;
                documentsAffected = writeConcernResult.DocumentsAffected;
                var updateRequest = request as UpdateRequest;

                if (upsertId == null &&
                    documentsAffected == 1 &&
                    updateRequest != null &&
                    updateRequest.IsUpsert &&
                    !writeConcernResult.UpdatedExisting)
                {
                    // Get the _id field first from the Update document
                    // and then from the Query document.
                    upsertId =
                        updateRequest.Update.ToBsonDocument().GetValue("_id", null) ??
                        updateRequest.Filter.ToBsonDocument().GetValue("_id", null);
                }
            }

            var upserts     = (upsertId == null) ? __noUpserts : new[] { new BulkWriteOperationUpsert(0, upsertId) };
            var writeErrors = __noWriteErrors;
            BulkWriteConcernError writeConcernError = null;

            if (writeConcernException != null)
            {
                var getLastErrorResponse = writeConcernResult.Response;
                if (IsGetLasterrorResponseAWriteConcernError(getLastErrorResponse))
                {
                    writeConcernError = CreateWriteConcernErrorFromGetLastErrorResponse(getLastErrorResponse);
                }
                else
                {
                    writeErrors = new[] { CreateWriteErrorFromGetLastErrorResponse(getLastErrorResponse) };
                }
            }

            if (request.RequestType == WriteRequestType.Insert && writeErrors.Count == 0)
            {
                documentsAffected = 1; // note: DocumentsAffected is 0 for inserts
            }

            var  matchedCount  = 0L;
            var  deletedCount  = 0L;
            var  insertedCount = 0L;
            long?modifiedCount = 0L;

            switch (request.RequestType)
            {
            case WriteRequestType.Delete:
                deletedCount = documentsAffected;
                break;

            case WriteRequestType.Insert:
                insertedCount = documentsAffected;
                break;

            case WriteRequestType.Update:
                matchedCount  = documentsAffected - upserts.Count();
                modifiedCount = null;     // getLasterror does not report this value
                break;
            }

            return(new BulkWriteBatchResult(
                       1, // batchCount
                       processedRequests,
                       unprocessedRequests,
                       matchedCount,
                       deletedCount,
                       insertedCount,
                       modifiedCount,
                       upserts,
                       writeErrors,
                       writeConcernError,
                       indexMap));
        }