예제 #1
0
        // protected methods
        /// <inheritdoc />
        protected override BsonDocument CreateCommand(ConnectionDescription connectionDescription, int attempt, long?transactionNumber)
        {
            var serverVersion = connectionDescription.ServerVersion;

            if (!Feature.Collation.IsSupported(serverVersion))
            {
                if (_updates.Items.Skip(_updates.Offset).Take(_updates.Count).Any(u => u.Collation != null))
                {
                    throw new NotSupportedException($"Server version {serverVersion} does not support collations.");
                }
            }
            if (!Feature.ArrayFilters.IsSupported(serverVersion))
            {
                if (_updates.Items.Skip(_updates.Offset).Take(_updates.Count).Any(u => u.ArrayFilters != null))
                {
                    throw new NotSupportedException($"Server version {serverVersion} does not support arrayFilters.");
                }
            }

            return(new BsonDocument
            {
                { "update", _collectionNamespace.CollectionName },
                { "ordered", IsOrdered },
                { "bypassDocumentValidation", () => _bypassDocumentValidation.Value, _bypassDocumentValidation.HasValue },
                { "writeConcern", () => WriteConcern.ToBsonDocument(), WriteConcern != null && !WriteConcern.IsServerDefault },
                { "txnNumber", () => transactionNumber.Value, transactionNumber.HasValue }
            });
        }
예제 #2
0
        public void CreateCommand_should_return_expected_result_when_WriteConcern_is_set(
            [Values(1, 2)]
            int w)
        {
            var requests     = new[] { new CreateIndexRequest(new BsonDocument("x", 1)) };
            var writeConcern = new WriteConcern(w);
            var subject      = new CreateIndexesUsingCommandOperation(_collectionNamespace, requests, _messageEncoderSettings)
            {
                WriteConcern = writeConcern
            };
            var session = OperationTestHelper.CreateSession();
            var connectionDescription = OperationTestHelper.CreateConnectionDescription();

            var result = subject.CreateCommand(session, connectionDescription);

            var expectedResult = new BsonDocument
            {
                { "createIndexes", _collectionNamespace.CollectionName },
                { "indexes", new BsonArray {
                      requests[0].CreateIndexDocument()
                  } },
                { "writeConcern", writeConcern.ToBsonDocument() }
            };

            result.Should().Be(expectedResult);
        }
        public void CreateCommand_should_return_expected_result_when_WriteConcern_is_set(
            [Values(1, 2)]
            int w,
            [Values(false, true)]
            bool isWriteConcernSupported)
        {
            var requests     = new[] { new CreateIndexRequest(new BsonDocument("x", 1)) };
            var writeConcern = new WriteConcern(w);
            var subject      = new CreateIndexesUsingCommandOperation(_collectionNamespace, requests, _messageEncoderSettings)
            {
                WriteConcern = writeConcern
            };
            var session = OperationTestHelper.CreateSession();
            var connectionDescription = OperationTestHelper.CreateConnectionDescription(serverVersion: Feature.CommandsThatWriteAcceptWriteConcern.SupportedOrNotSupportedVersion(isWriteConcernSupported));

            var result = subject.CreateCommand(session, connectionDescription);

            var expectedResult = new BsonDocument
            {
                { "createIndexes", _collectionNamespace.CollectionName },
                { "indexes", new BsonArray {
                      requests[0].CreateIndexDocument(null)
                  } },
                { "writeConcern", () => writeConcern.ToBsonDocument(), isWriteConcernSupported }
            };

            result.Should().Be(expectedResult);
        }
예제 #4
0
 // private methods
 internal BsonDocument CreateCommand(SemanticVersion serverVersion)
 {
     return(new BsonDocument
     {
         { "dropDatabase", 1 },
         { "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
     });
 }
예제 #5
0
 // private methods
 private BsonDocument CreateCommand()
 {
     return(new BsonDocument
     {
         { CommandName, 1 },
         { "writeConcern", () => _writeConcern.ToBsonDocument(), !_writeConcern.IsServerDefault }
     });
 }
예제 #6
0
 // private methods
 internal BsonDocument CreateCommand(SemanticVersion serverVersion)
 {
     return(new BsonDocument
     {
         { "reIndex", _collectionNamespace.CollectionName },
         { "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
     });
 }
예제 #7
0
 // private methods
 internal BsonDocument CreateCommand(SemanticVersion serverVersion)
 {
     return(new BsonDocument
     {
         { "createIndexes", _collectionNamespace.CollectionName },
         { "indexes", new BsonArray(_requests.Select(request => request.CreateIndexDocument(serverVersion))) },
         { "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
     });
 }
예제 #8
0
        public static BsonDocument GetWriteConcernForWriteCommand(ICoreSession session, WriteConcern writeConcern)
        {
            if (!session.IsInTransaction && writeConcern != null && !writeConcern.IsServerDefault)
            {
                return(writeConcern.ToBsonDocument());
            }

            return(null);
        }
예제 #9
0
        public static BsonDocument GetWriteConcernForCommand(ICoreSession session, WriteConcern writeConcern, SemanticVersion serverVersion, Feature requiredFeature)
        {
            if (!session.IsInTransaction && writeConcern != null && !writeConcern.IsServerDefault && requiredFeature.IsSupported(serverVersion))
            {
                return(writeConcern.ToBsonDocument());
            }

            return(null);
        }
 // protected methods
 /// <summary>
 /// Creates the command for the operation.
 /// </summary>
 /// <returns>The command.</returns>
 protected virtual BsonDocument CreateCommand()
 {
     return(new BsonDocument
     {
         { CommandName, 1 },
         { "writeConcern", () => _writeConcern.ToBsonDocument(), !_writeConcern.IsServerDefault },
         { "recoveryToken", _recoveryToken, _recoveryToken != null }
     });
 }
예제 #11
0
 // methods
 internal BsonDocument CreateCommand(SemanticVersion serverVersion)
 {
     return(new BsonDocument
     {
         { "dropIndexes", _collectionNamespace.CollectionName },
         { "index", _indexName },
         { "maxTimeMS", () => MaxTimeHelper.ToMaxTimeMS(_maxTime.Value), _maxTime.HasValue },
         { "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
     });
 }
 // methods
 internal BsonDocument CreateCommand(SemanticVersion serverVersion)
 {
     return(new BsonDocument
     {
         { "renameCollection", _collectionNamespace.FullName },
         { "to", _newCollectionNamespace.FullName },
         { "dropTarget", () => _dropTarget.Value, _dropTarget.HasValue },
         { "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
     });
 }
 // protected methods
 /// <inheritdoc />
 protected override BsonDocument CreateCommand(ConnectionDescription connectionDescription, int attempt, long?transactionNumber)
 {
     return(new BsonDocument
     {
         { "insert", _collectionNamespace.CollectionName },
         { "ordered", IsOrdered },
         { "bypassDocumentValidation", () => _bypassDocumentValidation, _bypassDocumentValidation.HasValue },
         { "writeConcern", () => WriteConcern.ToBsonDocument(), WriteConcern != null && !WriteConcern.IsServerDefault },
         { "txnNumber", () => transactionNumber.Value, transactionNumber.HasValue }
     });
 }
 // methods
 internal override BsonDocument CreateCommand(SemanticVersion serverVersion)
 {
     return(new BsonDocument
     {
         { "findAndModify", CollectionNamespace.CollectionName },
         { "query", _filter },
         { "sort", _sort, _sort != null },
         { "remove", true },
         { "fields", _projection, _projection != null },
         { "maxTimeMS", () => _maxTime.Value.TotalMilliseconds, _maxTime.HasValue },
         { "writeConcern", () => WriteConcern.ToBsonDocument(), WriteConcern != null && !WriteConcern.IsServerDefault && SupportedFeatures.IsFindAndModifyWriteConcernSupported(serverVersion) }
     });
 }
예제 #15
0
        // methods
        /// <inheritdoc/>
        protected internal override BsonDocument CreateCommand(ConnectionDescription connectionDescription, ICoreSession session)
        {
            var command = base.CreateCommand(connectionDescription, session);

            if (_bypassDocumentValidation.HasValue && Feature.BypassDocumentValidation.IsSupported(connectionDescription.ServerVersion))
            {
                command["bypassDocumentValidation"] = _bypassDocumentValidation.Value;
            }
            if (Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(connectionDescription.ServerVersion, _writeConcern))
            {
                command["writeConcern"] = _writeConcern.ToBsonDocument();
            }
            return(command);
        }
        // private methods
        internal BsonDocument CreateCommand(SemanticVersion serverVersion)
        {
            Feature.Views.ThrowIfNotSupported(serverVersion);
            Feature.Collation.ThrowIfNotSupported(serverVersion, _collation);

            return(new BsonDocument
            {
                { "create", _viewName },
                { "viewOn", _viewOn },
                { "pipeline", new BsonArray(_pipeline) },
                { "collation", () => _collation.ToBsonDocument(), _collation != null },
                { "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
            });
        }
예제 #17
0
        internal BsonDocument CreateCommand(SemanticVersion serverVersion)
        {
            Feature.Collation.ThrowIfNotSupported(serverVersion, _collation);

            return(new BsonDocument
            {
                { "aggregate", _collectionNamespace.CollectionName },
                { "pipeline", new BsonArray(_pipeline) },
                { "allowDiskUse", () => _allowDiskUse.Value, _allowDiskUse.HasValue },
                { "bypassDocumentValidation", () => _bypassDocumentValidation.Value, _bypassDocumentValidation.HasValue&& Feature.BypassDocumentValidation.IsSupported(serverVersion) },
                { "maxTimeMS", () => _maxTime.Value.TotalMilliseconds, _maxTime.HasValue },
                { "collation", () => _collation.ToBsonDocument(), _collation != null },
                { "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
            });
        }
 // methods
 internal override BsonDocument CreateCommand(SemanticVersion serverVersion)
 {
     return(new BsonDocument
     {
         { "findAndModify", CollectionNamespace.CollectionName },
         { "query", _filter },
         { "sort", _sort, _sort != null },
         { "update", _update },
         { "new", _returnDocument == ReturnDocument.After },
         { "fields", _projection, _projection != null },
         { "upsert", _isUpsert },
         { "maxTimeMS", () => _maxTime.Value.TotalMilliseconds, _maxTime.HasValue },
         { "writeConcern", () => WriteConcern.ToBsonDocument(), WriteConcern != null && !WriteConcern.IsServerDefault && SupportedFeatures.IsFindAndModifyWriteConcernSupported(serverVersion) },
         { "bypassDocumentValidation", () => _bypassDocumentValidation.Value, _bypassDocumentValidation.HasValue&& SupportedFeatures.IsBypassDocumentValidationSupported(serverVersion) }
     });
 }
예제 #19
0
        // methods
        internal override BsonDocument CreateCommand(SemanticVersion serverVersion, long?transactionNumber)
        {
            Feature.Collation.ThrowIfNotSupported(serverVersion, Collation);

            return(new BsonDocument
            {
                { "findAndModify", CollectionNamespace.CollectionName },
                { "query", _filter },
                { "remove", true },
                { "sort", _sort, _sort != null },
                { "fields", _projection, _projection != null },
                { "maxTimeMS", () => MaxTimeHelper.ToMaxTimeMS(_maxTime.Value), _maxTime.HasValue },
                { "writeConcern", () => WriteConcern.ToBsonDocument(), WriteConcern != null && !WriteConcern.IsServerDefault && Feature.FindAndModifyWriteConcern.IsSupported(serverVersion) },
                { "collation", () => Collation.ToBsonDocument(), Collation != null },
                { "txnNumber", () => transactionNumber, transactionNumber.HasValue }
            });
        }
예제 #20
0
        // protected methods
        /// <inheritdoc />
        protected override BsonDocument CreateCommand(ConnectionDescription connectionDescription, int attempt, long?transactionNumber)
        {
            if (!Feature.Collation.IsSupported(connectionDescription.ServerVersion))
            {
                if (_deletes.Items.Skip(_deletes.Offset).Take(_deletes.Count).Any(d => d.Collation != null))
                {
                    throw new NotSupportedException($"Server version {connectionDescription.ServerVersion} does not support collations.");
                }
            }

            return(new BsonDocument
            {
                { "delete", _collectionNamespace.CollectionName },
                { "ordered", IsOrdered },
                { "writeConcern", () => WriteConcern.ToBsonDocument(), WriteConcern != null && !WriteConcern.IsServerDefault },
                { "txnNumber", () => transactionNumber.Value, transactionNumber.HasValue }
            });
        }
        // methods
        internal override BsonDocument CreateCommand(SemanticVersion serverVersion, long?transactionNumber)
        {
            Feature.Collation.ThrowIfNotSupported(serverVersion, Collation);

            return(new BsonDocument
            {
                { "findAndModify", CollectionNamespace.CollectionName },
                { "query", _filter },
                { "update", _replacement },
                { "new", true, _returnDocument == ReturnDocument.After },
                { "sort", _sort, _sort != null },
                { "fields", _projection, _projection != null },
                { "upsert", true, _isUpsert },
                { "maxTimeMS", () => _maxTime.Value.TotalMilliseconds, _maxTime.HasValue },
                { "writeConcern", () => WriteConcern.ToBsonDocument(), WriteConcern != null && !WriteConcern.IsServerDefault && Feature.FindAndModifyWriteConcern.IsSupported(serverVersion) },
                { "bypassDocumentValidation", () => _bypassDocumentValidation.Value, _bypassDocumentValidation.HasValue&& Feature.BypassDocumentValidation.IsSupported(serverVersion) },
                { "collation", () => Collation.ToBsonDocument(), Collation != null },
                { "txnNumber", () => transactionNumber, transactionNumber.HasValue }
            });
        }
        // methods
        internal BsonDocument CreateCommand(SemanticVersion serverVersion)
        {
            Feature.Collation.ThrowIfNotSupported(serverVersion, _collation);

            return(new BsonDocument
            {
                { "create", _collectionNamespace.CollectionName },
                { "capped", () => _capped.Value, _capped.HasValue },
                { "autoIndexId", () => _autoIndexId.Value, _autoIndexId.HasValue },
                { "size", () => _maxSize.Value, _maxSize.HasValue },
                { "max", () => _maxDocuments.Value, _maxDocuments.HasValue },
                { "flags", () => _usePowerOf2Sizes.Value ? 1 : 0, _usePowerOf2Sizes.HasValue },
                { "storageEngine", () => _storageEngine, _storageEngine != null },
                { "indexOptionDefaults", _indexOptionDefaults, _indexOptionDefaults != null },
                { "validator", _validator, _validator != null },
                { "validationAction", () => _validationAction.Value.ToString().ToLowerInvariant(), _validationAction.HasValue },
                { "validationLevel", () => _validationLevel.Value.ToString().ToLowerInvariant(), _validationLevel.HasValue },
                { "collation", () => _collation.ToBsonDocument(), _collation != null },
                { "writeConcern", () => _writeConcern.ToBsonDocument(), Feature.CommandsThatWriteAcceptWriteConcern.ShouldSendWriteConcern(serverVersion, _writeConcern) }
            });
        }
        private BsonDocument CreateWriteCommand(BatchSerializer batchSerializer, BatchableSource <WriteRequest> requestSource, SemanticVersion serverVersion)
        {
            var batchWrapper = new BsonDocumentWrapper(requestSource, batchSerializer);

            WriteConcern effectiveWriteConcern = _writeConcern;

            if (!effectiveWriteConcern.IsAcknowledged && _isOrdered)
            {
                effectiveWriteConcern = WriteConcern.W1; // ignore the server's default, whatever it may be.
            }

            return(new BsonDocument
            {
                { CommandName, _collectionNamespace.CollectionName },
                { "writeConcern", () => effectiveWriteConcern.ToBsonDocument(), !effectiveWriteConcern.IsServerDefault },
                { "ordered", _isOrdered },
                { "bypassDocumentValidation", () => _bypassDocumentValidation.Value, _bypassDocumentValidation.HasValue&& Feature.BypassDocumentValidation.IsSupported(serverVersion) },
                { RequestsElementName, new BsonArray {
                      batchWrapper
                  } }                                                   // should be last
            });
        }