protected virtual async Task <BulkWriteBatchResult> EmulateSingleRequestAsync(IConnectionHandle connection, WriteRequest request, int originalIndex, TimeSpan timeout, CancellationToken cancellationToken) { var protocol = CreateProtocol(connection, request); WriteConcernResult writeConcernResult = null; WriteConcernException writeConcernException = null; try { writeConcernResult = await protocol.ExecuteAsync(connection, timeout, cancellationToken); } catch (WriteConcernException ex) { writeConcernResult = ex.WriteConcernResult; writeConcernException = ex; } var indexMap = new IndexMap.RangeBased(0, originalIndex, 1); return(BulkWriteBatchResult.Create( request, writeConcernResult, writeConcernException, indexMap)); }
// 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 }
// protected methods protected override BulkWriteBatchResult EmulateSingleRequest(MongoConnection connection, WriteRequest request, int originalIndex) { var serverInstance = connection.ServerInstance; var insertRequest = (InsertRequest)request; var insertRequests = new[] { insertRequest }; var operationArgs = new BulkInsertOperationArgs( _args.AssignId, _args.CheckElementNames, _args.CollectionName, _args.DatabaseName, 1, // maxBatchCount serverInstance.MaxMessageLength, // maxBatchLength true, // isOrdered _args.ReaderSettings, insertRequests, _args.WriteConcern, _args.WriterSettings); var operation = new InsertOpcodeOperation(operationArgs); WriteConcernResult writeConcernResult = null; WriteConcernException writeConcernException = null; try { var operationResult = operation.Execute(connection); if (operationResult != null) { writeConcernResult = operationResult.First(); } } catch (WriteConcernException ex) { writeConcernResult = ex.WriteConcernResult; writeConcernException = ex; } var indexMap = new IndexMap.RangeBased(0, originalIndex, 1); return(BulkWriteBatchResult.Create( insertRequest, writeConcernResult, writeConcernException, indexMap)); }
// protected methods protected override BulkWriteBatchResult EmulateSingleRequest(MongoConnection connection, WriteRequest request, int originalIndex) { var serverInstance = connection.ServerInstance; var deleteRequest = (DeleteRequest)request; var deleteRequests = new[] { deleteRequest }; var operationArgs = new BulkDeleteOperationArgs( _args.CollectionName, _args.DatabaseName, 1, // maxBatchCount serverInstance.MaxMessageLength, // maxBatchLength serverInstance.MaxDocumentSize, serverInstance.MaxWireDocumentSize, true, // isOrdered _args.ReaderSettings, deleteRequests, _args.WriteConcern, _args.WriterSettings); var operation = new DeleteOpcodeOperation(operationArgs); WriteConcernResult writeConcernResult; WriteConcernException writeConcernException = null; try { writeConcernResult = operation.Execute(connection); } catch (WriteConcernException ex) { writeConcernResult = ex.WriteConcernResult; writeConcernException = ex; } var indexMap = new IndexMap.RangeBased(0, originalIndex, 1); return(BulkWriteBatchResult.Create( deleteRequest, writeConcernResult, writeConcernException, indexMap)); }
// 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 }
protected virtual async Task<BulkWriteBatchResult> EmulateSingleRequestAsync(IConnectionHandle connection, WriteRequest request, int originalIndex, TimeSpan timeout, CancellationToken cancellationToken) { var protocol = CreateProtocol(connection, request); WriteConcernResult writeConcernResult = null; WriteConcernException writeConcernException = null; try { var protocolResult = await protocol.ExecuteAsync(connection, timeout, cancellationToken); if (protocolResult != null) { writeConcernResult = new WriteConcernResult(protocolResult); } } catch (WriteException ex) { writeConcernResult = new WriteConcernResult(ex.Result); writeConcernException = new WriteConcernException(ex.Message, writeConcernResult); } var indexMap = new IndexMap.RangeBased(0, originalIndex, 1); return BulkWriteBatchResult.Create( request, writeConcernResult, writeConcernException, indexMap); }
public static BulkWriteBatchResult Create( WriteRequest request, WriteConcernResult writeConcernResult, WriteConcernException writeConcernException, IndexMap indexMap) { var processedRequests = new[] { request }; var unprocessedRequests = Enumerable.Empty <WriteRequest>(); 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.GetValueOrDefault(false) && !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.Query.ToBsonDocument().GetValue("_id", null); } } var upserts = (upsertId == null) ? Enumerable.Empty <BulkWriteUpsert>() : new[] { new BulkWriteUpsert(0, upsertId) }; var writeErrors = __noWriteErrors; WriteConcernError writeConcernError = null; Batch <WriteRequest> nextBatch = 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, nextBatch)); }
public static BulkWriteBatchResult Create( WriteRequest request, WriteConcernResult writeConcernResult, WriteConcernException 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.Criteria.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); }
private void LogSafeModeException(WriteConcernException mongoSafeModeException, string exceptionIntroduction) { //Log.ErrorFormat("MongoDB {1} Error -> {0}", mongoSafeModeException.Message, exceptionIntroduction); //Log.ErrorFormat("Result -> {0}", mongoSafeModeException.CommandResult.ToJson()); //Log.ErrorFormat("Data -> {0}", mongoSafeModeException.Data.ToJson()); }
public static BulkWriteBatchResult Create( WriteRequest request, WriteConcernResult writeConcernResult, WriteConcernException writeConcernException, IndexMap indexMap) { var processedRequests = new[] { request }; var unprocessedRequests = Enumerable.Empty <WriteRequest>(); var upsertId = (writeConcernResult == null) ? null : writeConcernResult.Upserted; var upserts = (upsertId == null) ? Enumerable.Empty <BulkWriteUpsert>() : new[] { new BulkWriteUpsert(0, upsertId) }; var writeErrors = __noWriteErrors; WriteConcernError writeConcernError = null; Batch <WriteRequest> nextBatch = null; if (writeConcernException != null) { var getLastErrorResponse = writeConcernResult.Response; if (IsGetLasterrorResponseAWriteConcernError(getLastErrorResponse)) { writeConcernError = CreateWriteConcernErrorFromGetLastErrorResponse(getLastErrorResponse); } else { writeErrors = new[] { CreateWriteErrorFromGetLastErrorResponse(getLastErrorResponse) }; } } var documentsAffected = (writeConcernResult == null) ? 0 : writeConcernResult.DocumentsAffected; 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, nextBatch)); }
public IEnumerable <WriteConcernResult> Execute(MongoConnection connection) { WriteConcernException finalException = null; List <WriteConcernResult> results = (WriteConcern.Enabled) ? new List <WriteConcernResult>() : null; using (var bsonBuffer = new BsonBuffer(new MultiChunkBuffer(BsonChunkPool.Default), true)) { var readerSettings = GetNodeAdjustedReaderSettings(connection.ServerInstance); var writerSettings = GetNodeAdjustedWriterSettings(connection.ServerInstance); var message = new MongoInsertMessage(writerSettings, CollectionFullName, _checkElementNames, _flags); message.WriteToBuffer(bsonBuffer); // must be called before AddDocument var writeConcernEnabled = WriteConcern.Enabled; var continueOnError = (_flags & InsertFlags.ContinueOnError) != 0; foreach (var document in _documents) { if (document == null) { throw new ArgumentException("Batch contains one or more null documents."); } if (_assignIdOnInsert) { var serializer = BsonSerializer.LookupSerializer(document.GetType()); var idProvider = serializer as IBsonIdProvider; if (idProvider != null) { object id; Type idNominalType; IIdGenerator idGenerator; if (idProvider.GetDocumentId(document, out id, out idNominalType, out idGenerator)) { if (idGenerator != null && idGenerator.IsEmpty(id)) { id = idGenerator.GenerateId(_idGeneratorContainer, document); idProvider.SetDocumentId(document, id); } } } } message.AddDocument(bsonBuffer, _documentType, document); if (message.MessageLength > connection.ServerInstance.MaxMessageLength) { byte[] lastDocument = message.RemoveLastDocument(bsonBuffer); if (writeConcernEnabled && !continueOnError) { try { var result = SendMessageWithWriteConcern(connection, bsonBuffer, message.RequestId, readerSettings, writerSettings, WriteConcern); results.Add(result); } catch (WriteConcernException ex) { results.Add((WriteConcernResult)ex.CommandResult); ex.Data["results"] = results; throw ex; } } else if (writeConcernEnabled && continueOnError) { try { var result = SendMessageWithWriteConcern(connection, bsonBuffer, message.RequestId, readerSettings, writerSettings, WriteConcern); results.Add(result); } catch (WriteConcernException ex) { finalException = ex; results.Add((WriteConcernResult)ex.CommandResult); } } else if (!writeConcernEnabled && !continueOnError) { try { SendMessageWithWriteConcern(connection, bsonBuffer, message.RequestId, readerSettings, writerSettings, WriteConcern.Acknowledged); } catch (WriteConcernException) { return(null); } } else if (!writeConcernEnabled && continueOnError) { SendMessageWithWriteConcern(connection, bsonBuffer, message.RequestId, readerSettings, writerSettings, WriteConcern.Unacknowledged); } message.ResetBatch(bsonBuffer, lastDocument); } } if (writeConcernEnabled) { try { var result = SendMessageWithWriteConcern(connection, bsonBuffer, message.RequestId, readerSettings, writerSettings, WriteConcern); results.Add(result); } catch (WriteConcernException ex) { finalException = ex; results.Add((WriteConcernResult)ex.CommandResult); } if (finalException != null) { finalException.Data["results"] = results; throw finalException; } return(results); } else { SendMessageWithWriteConcern(connection, bsonBuffer, message.RequestId, readerSettings, writerSettings, WriteConcern.Unacknowledged); return(null); } } }