Beispiel #1
0
        public Task <T> RunCommandAsync <T>(object command, TimeSpan?timeout, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(command, "command");

            var commandDocument = command as BsonDocument;

            if (commandDocument == null)
            {
                if (command is string)
                {
                    commandDocument = BsonDocument.Parse((string)command);
                }
                else
                {
                    var commandSerializer = _settings.SerializerRegistry.GetSerializer(command.GetType());
                    commandDocument = new BsonDocumentWrapper(command, commandSerializer);
                }
            }

            var isReadCommand          = CanCommandBeSentToSecondary.Delegate(commandDocument);
            var serializer             = _settings.SerializerRegistry.GetSerializer <T>();
            var messageEncoderSettings = GetMessageEncoderSettings();

            if (isReadCommand)
            {
                var operation = new ReadCommandOperation <T>(_databaseNamespace, commandDocument, serializer, messageEncoderSettings);
                return(ExecuteReadOperation <T>(operation, timeout, cancellationToken));
            }
            else
            {
                var operation = new WriteCommandOperation <T>(_databaseNamespace, commandDocument, serializer, messageEncoderSettings);
                return(ExecuteWriteOperation <T>(operation, timeout, cancellationToken));
            }
        }
        // methods
        public bool Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            using (var channelSource = binding.GetWriteChannelSource(cancellationToken))
            {
                var userExists = UserExists(channelSource, binding.Session, cancellationToken);

                var roles = new BsonArray();
                if (_databaseNamespace.DatabaseName == "admin")
                {
                    roles.Add(_readOnly ? "readAnyDatabase" : "root");
                }
                else
                {
                    roles.Add(_readOnly ? "read" : "dbOwner");
                }

                var commandName = userExists ? "updateUser" : "createUser";
                var command     = new BsonDocument
                {
                    { commandName, _username },
                    { "pwd", _passwordHash },
                    { "digestPassword", false },
                    { "roles", roles }
                };

                var operation = new WriteCommandOperation <BsonDocument>(_databaseNamespace, command, BsonDocumentSerializer.Instance, _messageEncoderSettings);
                operation.Execute(channelSource, binding.Session, cancellationToken);
            }

            return(true);
        }
        // methods
        public bool Execute(IWriteBinding binding, CancellationToken cancellationToken)
        {
            var command   = new BsonDocument("dropUser", _username);
            var operation = new WriteCommandOperation <BsonDocument>(_databaseNamespace, command, BsonDocumentSerializer.Instance, _messageEncoderSettings);

            operation.Execute(binding, cancellationToken);
            return(true);
        }
Beispiel #4
0
        // methods
        public async Task <bool> ExecuteAsync(IWriteBinding binding, CancellationToken cancellationToken)
        {
            var command   = new BsonDocument("dropUser", _username);
            var operation = new WriteCommandOperation <BsonDocument>(_databaseNamespace, command, BsonDocumentSerializer.Instance, _messageEncoderSettings);
            await operation.ExecuteAsync(binding, cancellationToken).ConfigureAwait(false);

            return(true);
        }
Beispiel #5
0
        private void ExecuteCommand(BsonDocument command)
        {
            var adminDatabase = new DatabaseNamespace("admin");
            var operation     = new WriteCommandOperation <BsonDocument>(
                adminDatabase,
                command,
                BsonDocumentSerializer.Instance,
                new MessageEncoderSettings());

            operation.Execute(_binding, CancellationToken.None);
        }
        private void ExecuteCommand(BsonDocument command, bool waitForConnected)
        {
            if (waitForConnected)
            {
                // server can transition to unknown state during the test, wait until server is connected
                SpinWait.SpinUntil(() => _server.Description.State == ServerState.Connected, 1000);
            }

            var adminDatabase = new DatabaseNamespace("admin");
            var operation     = new WriteCommandOperation <BsonDocument>(
                adminDatabase,
                command,
                BsonDocumentSerializer.Instance,
                new MessageEncoderSettings());

            operation.Execute(_binding, CancellationToken.None);
        }
        internal TCommandResult RunCommandAs <TCommandResult>(
            IMongoCommand command,
            IBsonSerializer <TCommandResult> resultSerializer,
            ReadPreference readPreference)
            where TCommandResult : CommandResult
        {
            var commandDocument = command.ToBsonDocument();
            var isReadCommand   = CanCommandBeSentToSecondary.Delegate(commandDocument);

            if (readPreference != ReadPreference.Primary)
            {
                var timeoutAt = DateTime.UtcNow + _server.Settings.ConnectTimeout;
                var cluster   = _server.Cluster;

                var clusterType = cluster.Description.Type;
                while (clusterType == ClusterType.Unknown)
                {
                    // TODO: find a way to block until the cluster description changes
                    if (DateTime.UtcNow >= timeoutAt)
                    {
                        throw new TimeoutException();
                    }
                    Thread.Sleep(TimeSpan.FromMilliseconds(20));
                    clusterType = cluster.Description.Type;
                }

                if (clusterType == ClusterType.ReplicaSet && !isReadCommand)
                {
                    readPreference = ReadPreference.Primary;
                }
            }

            var messageEncoderSettings = GetMessageEncoderSettings();

            if (isReadCommand)
            {
                var operation = new ReadCommandOperation <TCommandResult>(_namespace, commandDocument, resultSerializer, messageEncoderSettings);
                return(ExecuteReadOperation(operation, readPreference));
            }
            else
            {
                var operation = new WriteCommandOperation <TCommandResult>(_namespace, commandDocument, resultSerializer, messageEncoderSettings);
                return(ExecuteWriteOperation(operation));
            }
        }
        private TCommandResult RunWriteCommandAs <TCommandResult>(
            BsonDocument command,
            IBsonSerializer <TCommandResult> resultSerializer,
            out MongoServerInstance serverInstance)
            where TCommandResult : CommandResult
        {
            var messageEncoderSettings = GetMessageEncoderSettings();
            var operation = new WriteCommandOperation <TCommandResult>(new DatabaseNamespace(_name), command, resultSerializer, messageEncoderSettings);

            using (var binding = _server.GetWriteBinding())
                using (var connectionSource = binding.GetWriteConnectionSource())
                {
                    var endPoint = (DnsEndPoint)connectionSource.ServerDescription.EndPoint;
                    var address  = new MongoServerAddress(endPoint.Host, endPoint.Port);
                    serverInstance = _server.GetServerInstance(address);
                    return(operation.Execute(connectionSource, Timeout.InfiniteTimeSpan, CancellationToken.None));
                }
        }
        public override Task <TResult> RunCommandAsync <TResult>(Command <TResult> command, ReadPreference readPreference = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            Ensure.IsNotNull(command, "command");
            readPreference = readPreference ?? ReadPreference.Primary;

            var renderedCommand        = command.Render(_settings.SerializerRegistry);
            var messageEncoderSettings = GetMessageEncoderSettings();

            if (readPreference == ReadPreference.Primary)
            {
                var operation = new WriteCommandOperation <TResult>(_databaseNamespace, renderedCommand.Document, renderedCommand.ResultSerializer, messageEncoderSettings);
                return(ExecuteWriteOperation <TResult>(operation, cancellationToken));
            }
            else
            {
                var operation = new ReadCommandOperation <TResult>(_databaseNamespace, renderedCommand.Document, renderedCommand.ResultSerializer, messageEncoderSettings);
                return(ExecuteReadOperation <TResult>(operation, readPreference, cancellationToken));
            }
        }
Beispiel #10
0
        internal TCommandResult RunCommandAs <TCommandResult>(
            IMongoCommand command,
            IBsonSerializer <TCommandResult> resultSerializer,
            ReadPreference readPreference)
            where TCommandResult : CommandResult
        {
            var commandDocument        = command.ToBsonDocument();
            var messageEncoderSettings = GetMessageEncoderSettings();

            if (readPreference == ReadPreference.Primary)
            {
                var operation = new WriteCommandOperation <TCommandResult>(_namespace, commandDocument, resultSerializer, messageEncoderSettings);
                return(ExecuteWriteOperation(operation));
            }
            else
            {
                var operation = new ReadCommandOperation <TCommandResult>(_namespace, commandDocument, resultSerializer, messageEncoderSettings);
                return(ExecuteReadOperation(operation, readPreference));
            }
        }
        public Task <T> RunCommandAsync <T>(object command, ReadPreference readPreference = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            Ensure.IsNotNull(command, "command");
            readPreference = readPreference ?? ReadPreference.Primary;

            var commandDocument        = BsonDocumentHelper.ToBsonDocument(_settings.SerializerRegistry, command);
            var serializer             = _settings.SerializerRegistry.GetSerializer <T>();
            var messageEncoderSettings = GetMessageEncoderSettings();

            if (readPreference == ReadPreference.Primary)
            {
                var operation = new WriteCommandOperation <T>(_databaseNamespace, commandDocument, serializer, messageEncoderSettings);
                return(ExecuteWriteOperation <T>(operation, cancellationToken));
            }
            else
            {
                var operation = new ReadCommandOperation <T>(_databaseNamespace, commandDocument, serializer, messageEncoderSettings);
                return(ExecuteReadOperation <T>(operation, readPreference, cancellationToken));
            }
        }
        public Task <T> RunCommandAsync <T>(object command, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(command, "command");

            var commandDocument = BsonDocumentHelper.ToBsonDocument(_settings.SerializerRegistry, command);

            var isReadCommand          = CanCommandBeSentToSecondary.Delegate(commandDocument);
            var serializer             = _settings.SerializerRegistry.GetSerializer <T>();
            var messageEncoderSettings = GetMessageEncoderSettings();

            if (isReadCommand)
            {
                var operation = new ReadCommandOperation <T>(_databaseNamespace, commandDocument, serializer, messageEncoderSettings);
                return(ExecuteReadOperation <T>(operation, cancellationToken));
            }
            else
            {
                var operation = new WriteCommandOperation <T>(_databaseNamespace, commandDocument, serializer, messageEncoderSettings);
                return(ExecuteWriteOperation <T>(operation, cancellationToken));
            }
        }