public void Should_convert_from_core_exception_with_a_write_concern_error_when_original_models_exists() { var exception = new BulkWriteOperationException( result:new BulkWriteOperationResult.Acknowledged( requestCount: 1, matchedCount: 1, deletedCount: 0, insertedCount: 0, modifiedCount: 0, processedRequests: new[] { new InsertRequest(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 BsonDocument("a", 1)) { CorrelationId = 0 } }); var models = new [] { new InsertOneModel<BsonDocument>(new BsonDocument("a", 1)), new InsertOneModel<BsonDocument>(new BsonDocument("b", 1)) }; var mapped = BulkWriteException<BsonDocument>.FromCore(exception, models); mapped.Result.ProcessedRequests.Count.Should().Be(1); mapped.Result.ProcessedRequests[0].Should().BeSameAs(models[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().BeSameAs(models[0]); }
protected override void When() { var subject = new BulkMixedWriteOperation(CollectionNamespace, _requests, MessageEncoderSettings) { IsOrdered = false }; _exception = Catch<BulkWriteOperationException>(() => ExecuteOperationAsync(subject).GetAwaiter().GetResult()); }
// methods public async Task <WriteConcernResult> ExecuteAsync(IConnectionHandle connection, TimeSpan timeout = default(TimeSpan), CancellationToken cancellationToken = default(CancellationToken)) { Ensure.IsNotNull(connection, "connection"); var requests = _documentSource.GetRemainingItems().Select(d => { if (d == null) { throw new ArgumentException("Batch contains one or more null documents."); } return(new InsertRequest(new BsonDocumentWrapper(d, _serializer))); }); var operation = new BulkInsertOperation(_collectionNamespace, requests, _messageEncoderSettings) { IsOrdered = !_continueOnError, MaxBatchCount = _maxBatchCount, MaxBatchLength = _maxMessageSize, // ReaderSettings = ? WriteConcern = _writeConcern, // WriteSettings = ? }; BulkWriteOperationResult bulkWriteResult; BulkWriteOperationException bulkWriteException = null; try { bulkWriteResult = await operation.ExecuteAsync(connection, timeout, cancellationToken).ConfigureAwait(false); } catch (BulkWriteOperationException ex) { bulkWriteResult = ex.Result; bulkWriteException = ex; } var converter = new BulkWriteOperationResultConverter(); if (bulkWriteException != null) { throw converter.ToWriteConcernException(bulkWriteException); } else { if (_writeConcern.IsAcknowledged) { return(converter.ToWriteConcernResult(bulkWriteResult)); } else { return(null); } } }
public void Constructor_should_work() { var processedRequests = new WriteRequest[0]; var upserts = new BulkWriteOperationUpsert[0]; var result = new BulkWriteOperationResult.Acknowledged(1, 2, 3, 4, 5, processedRequests, upserts); var writeErrors = new BulkWriteOperationError[0]; var writeConcernError = new BulkWriteConcernError(1, "message", new BsonDocument("x", 1)); var unprocessedRequests = new WriteRequest[0]; var subject = new BulkWriteOperationException(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 void Constructor_should_work() { var processedRequests = new WriteRequest[0]; var upserts = new BulkWriteUpsert[0]; var result = new AcknowledgedBulkWriteOperationResult(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 BulkWriteOperationException(result, writeErrors, writeConcernError, unprocessedRequests); subject.Result.Should().BeSameAs(result); subject.UnprocessedRequests.Should().BeSameAs(unprocessedRequests); subject.WriteConcernError.Should().BeSameAs(writeConcernError); subject.WriteErrors.Should().BeSameAs(writeErrors); }
// methods public async Task <WriteConcernResult> ExecuteAsync(IConnectionHandle connection, TimeSpan timeout = default(TimeSpan), CancellationToken cancellationToken = default(CancellationToken)) { Ensure.IsNotNull(connection, "connection"); var limit = _isMulti ? 0 : 1; var requests = new[] { new DeleteRequest(_criteria) { Limit = limit } }; var operation = new BulkDeleteOperation(_collectionNamespace, requests, _messageEncoderSettings) { WriteConcern = _writeConcern }; BulkWriteOperationResult bulkWriteResult; BulkWriteOperationException bulkWriteException = null; try { bulkWriteResult = await operation.ExecuteAsync(connection, timeout, cancellationToken); } catch (BulkWriteOperationException ex) { bulkWriteResult = ex.Result; bulkWriteException = ex; } var converter = new BulkWriteOperationResultConverter(); if (bulkWriteException != null) { throw converter.ToWriteConcernException(bulkWriteException); } else { if (_writeConcern.IsAcknowledged) { return(converter.ToWriteConcernResult(bulkWriteResult)); } else { return(null); } } }
public static BulkWriteBatchResult Create( BulkWriteOperationResult result, BulkWriteOperationException 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; BulkWriteConcernError 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)); }
// public methods public Exception ToWriteConcernException(BulkWriteOperationException 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 BulkWriteOperationUpsert[0]; var result = new BulkWriteOperationResult.Acknowledged(1, 2, 3, 4, 5, processedRequests, upserts); var writeErrors = new BulkWriteOperationError[0]; var writeConcernError = new BulkWriteConcernError(1, "message", new BsonDocument("x", 1)); var unprocessedRequests = new WriteRequest[0]; var subject = new BulkWriteOperationException(result, writeErrors, writeConcernError, unprocessedRequests); var formatter = new BinaryFormatter(); using (var stream = new MemoryStream()) { formatter.Serialize(stream, subject); stream.Position = 0; var rehydrated = (BulkWriteOperationException)formatter.Deserialize(stream); rehydrated.Result.Should().BeNull(); rehydrated.UnprocessedRequests.Should().BeNull(); rehydrated.WriteConcernError.Should().BeNull(); rehydrated.WriteErrors.Should().BeNull(); } }
private async Task <BulkWriteBatchResult> ExecuteBatchAsync(IConnectionHandle connection, Run run, TimeSpan timeout, CancellationToken cancellationToken) { BulkWriteOperationResult result; BulkWriteOperationException 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 MongoInternalException("Unrecognized RequestType."); } } catch (BulkWriteOperationException ex) { result = ex.Result; exception = ex; } return(BulkWriteBatchResult.Create(result, exception, run.IndexMap)); }
public void Serialization_should_drop_custom_fields() { var processedRequests = new WriteRequest[0]; var upserts = new BulkWriteUpsert[0]; var result = new AcknowledgedBulkWriteOperationResult(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 BulkWriteOperationException(result, writeErrors, writeConcernError, unprocessedRequests); var formatter = new BinaryFormatter(); using (var stream = new MemoryStream()) { formatter.Serialize(stream, subject); stream.Position = 0; var rehydrated = (BulkWriteOperationException)formatter.Deserialize(stream); rehydrated.Result.Should().BeNull(); rehydrated.UnprocessedRequests.Should().BeNull(); rehydrated.WriteConcernError.Should().BeNull(); rehydrated.WriteErrors.Should().BeNull(); } }
// public methods public Exception ToWriteConcernException(BulkWriteOperationException 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 static BulkWriteBatchResult Create( BulkWriteOperationResult result, BulkWriteOperationException 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; BulkWriteConcernError 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); }
// private methods private WriteConcernResult ToWriteConcernResult(BulkWriteOperationResult bulkWriteResult, BulkWriteOperationException 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 }, }; if (details != null) { getLastErrorResponse.Merge(details, false); // don't overwrite existing elements } return(new WriteConcernResult(getLastErrorResponse)); }
// private methods private WriteConcernResult ToWriteConcernResult(BulkWriteOperationResult bulkWriteResult, BulkWriteOperationException 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; BulkWriteOperationUpsert 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 }, }; if (details != null) { getLastErrorResponse.Merge(details, false); // don't overwrite existing elements } return new WriteConcernResult(getLastErrorResponse); }