예제 #1
0
        // private methods
        private void Initialize(CancellationToken cancellationToken)
        {
            _channelSource = _binding.GetWriteChannelSource(cancellationToken);
            var serverDescription = _channelSource.ServerDescription;

            try
            {
                _channel = _channelSource.GetChannel(cancellationToken);
            }
            catch (Exception ex) when(RetryableWriteOperationExecutor.ShouldConnectionAcquireBeRetried(this, serverDescription, ex))
            {
                ReplaceChannelSource(_binding.GetWriteChannelSource(cancellationToken));
                ReplaceChannel(_channelSource.GetChannel(cancellationToken));
            }
        }
예제 #2
0
        // methods
        public bool Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
            {
                var collectionNamespace = new CollectionNamespace(_databaseNamespace, "system.users");

                var user = FindUser(channelSource, binding.Session, collectionNamespace, cancellationToken);
                if (user == null)
                {
                    user = new BsonDocument
                    {
                        { "_id", ObjectId.GenerateNewId() },
                        { "user", _username },
                        { "pwd", _passwordHash },
                        { "readOnly", _readOnly },
                    };
                    InsertUser(channelSource, binding.Session, collectionNamespace, user, cancellationToken);
                }
                else
                {
                    user["pwd"]      = _passwordHash;
                    user["readOnly"] = _readOnly;
                    UpdateUser(channelSource, binding.Session, collectionNamespace, user, cancellationToken);
                }
            }

            return(true);
        }
        // public methods
        /// <inheritdoc/>
        public IEnumerable <WriteConcernResult> Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(binding, nameof(binding));

            using (EventContext.BeginOperation())
                using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
                    using (var channel = channelSource.GetChannel(cancellationToken))
                    {
                        if (SupportedFeatures.AreWriteCommandsSupported(channel.ConnectionDescription.ServerVersion) && _writeConcern.IsAcknowledged)
                        {
                            var emulator = CreateEmulator();
                            var result   = emulator.Execute(channel, cancellationToken);
                            return(new[] { result });
                        }
                        else
                        {
                            if (_documentSource.Batch == null)
                            {
                                return(InsertMultipleBatches(channel, cancellationToken));
                            }
                            else
                            {
                                var result = InsertSingleBatch(channel, cancellationToken);
                                return(new[] { result });
                            }
                        }
                    }
        }
 public BulkWriteOperationResult Execute(IWriteBinding binding, CancellationToken cancellationToken)
 {
     using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
         using (var channel = channelSource.GetChannel(cancellationToken))
         {
             return(Execute(channel, cancellationToken));
         }
 }
예제 #5
0
 /// <inheritdoc/>
 public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellationToken)
 {
     using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
         using (var channel = channelSource.GetChannel(cancellationToken))
             using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel, binding.Session))
             {
                 var operation = CreateWriteOperation(channel.ConnectionDescription, binding.Session);
                 return(operation.Execute(channelBinding, cancellationToken));
             }
 }
        // methods
        /// <inheritdoc/>
        public TCommandResult Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(binding, nameof(binding));

            using (EventContext.BeginOperation())
                using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
                {
                    return(ExecuteProtocol(channelSource, ReadPreference.Primary, cancellationToken));
                }
        }
 // public methods
 /// <inheritdoc/>
 public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellationToken)
 {
     using (EventContext.BeginOperation())
         using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
             using (var channel = channelSource.GetChannel(cancellationToken))
                 using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
                 {
                     var operation = CreateOperation(channel);
                     return(operation.Execute(channelBinding, cancellationToken));
                 }
 }
예제 #8
0
 // public methods
 /// <inheritdoc/>
 public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellationToken)
 {
     using (EventContext.BeginOperation())
         using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
             using (var channel = channelSource.GetChannel(cancellationToken))
                 using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel, binding.Session.Fork()))
                 {
                     var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
                     var result    = operation.Execute(channelBinding, cancellationToken);
                     WriteConcernErrorHelper.ThrowIfHasWriteConcernError(channel.ConnectionDescription.ConnectionId, result);
                     return(result);
                 }
 }
예제 #9
0
        // private methods
        private void Initialize(CancellationToken cancellationToken)
        {
            _channelSource = _binding.GetWriteChannelSource(cancellationToken);
            var serverDescription = _channelSource.ServerDescription;

            try
            {
                _channel = _channelSource.GetChannel(cancellationToken);
            }
            catch (MongoConnectionPoolPausedException)
            {
                if (RetryableWriteOperationExecutor.ShouldConnectionAcquireBeRetried(this, serverDescription))
                {
                    ReplaceChannelSource(_binding.GetWriteChannelSource(cancellationToken));
                    ReplaceChannel(_channelSource.GetChannel(cancellationToken));
                }
                else
                {
                    throw;
                }
            }
        }
예제 #10
0
        // methods
        public bool Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
                using (var channel = channelSource.GetChannel(cancellationToken))
                    using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel, binding.Session.Fork()))
                    {
                        var operation = new DropUserUsingUserManagementCommandsOperation(
                            _databaseNamespace,
                            _username,
                            _messageEncoderSettings);

                        return(operation.Execute(channelBinding, cancellationToken));
                    }
        }
        // methods
        /// <inheritdoc/>
        public BsonDocument Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(binding, nameof(binding));

            var mayUseSecondary = new MayUseSecondary(_readPreference);

            using (var channelSource = binding.GetWriteChannelSource(mayUseSecondary, cancellationToken))
                using (var channel = channelSource.GetChannel(cancellationToken))
                    using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel, binding.Session.Fork()))
                    {
                        var operation = CreateOperation(channelBinding.Session, channel.ConnectionDescription, mayUseSecondary.EffectiveReadPreference);
                        return(operation.Execute(channelBinding, cancellationToken));
                    }
        }
        // public methods
        /// <inheritdoc/>
        public TResult Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(binding, nameof(binding));

            using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
                using (var channel = channelSource.GetChannel(cancellationToken))
                    using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
                    {
                        var operation = CreateOperation(channel.ConnectionDescription.ServerVersion);
                        using (var rawBsonDocument = operation.Execute(channelBinding, cancellationToken))
                        {
                            return(ProcessCommandResult(channel.ConnectionDescription.ConnectionId, rawBsonDocument));
                        }
                    }
        }
예제 #13
0
        // methods
        public bool Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
                using (var channel = channelSource.GetChannel(cancellationToken))
                    using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel, binding.Session.Fork()))
                    {
                        IWriteOperation <bool> operation;
                        if (Feature.UserManagementCommands.IsSupported(channel.ConnectionDescription.ServerVersion))
                        {
                            operation = new AddUserUsingUserManagementCommandsOperation(_databaseNamespace, _username, _passwordHash, _readOnly, _messageEncoderSettings);
                        }
                        else
                        {
                            operation = new AddUserUsingSystemUsersCollectionOperation(_databaseNamespace, _username, _passwordHash, _readOnly, _messageEncoderSettings);
                        }

                        return(operation.Execute(channelBinding, cancellationToken));
                    }
        }
예제 #14
0
        // methods
        public bool Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
                using (var channel = channelSource.GetChannel(cancellationToken))
                    using (var channelBinding = new ChannelReadWriteBinding(channelSource.Server, channel))
                    {
                        IWriteOperation <bool> operation;
                        if (channel.ConnectionDescription.ServerVersion >= __serverVersionSupportingUserManagementCommands)
                        {
                            operation = new DropUserUsingUserManagementCommandsOperation(_databaseNamespace, _username, _messageEncoderSettings);
                        }
                        else
                        {
                            operation = new DropUserUsingSystemUsersCollectionOperation(_databaseNamespace, _username, _messageEncoderSettings);
                        }

                        return(operation.Execute(channelBinding, cancellationToken));
                    }
        }
예제 #15
0
 /// <inheritdoc/>
 public IChannelSourceHandle GetWriteChannelSource(CancellationToken cancellationToken)
 {
     ThrowIfDisposed();
     return(_writeBinding.GetWriteChannelSource(cancellationToken));
 }