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
        }
Esempio n. 3
0
        // 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);
        }
Esempio n. 9
0
 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);
                }
            }
        }