Exemple #1
0
        public void WithTagSets_should_return_same_instance_when_the_value_is_the_same()
        {
            var tagSets1        = new[] { new TagSet(new[] { new Tag("name", "value") }) };
            var tagSets2        = new[] { new TagSet(new[] { new Tag("name", "value") }) };
            var readPreference1 = new ReadPreference(ReadPreferenceMode.Primary, tagSets1);
            var readPreference2 = readPreference1.WithTagSets(tagSets2);

            readPreference2.Should().BeSameAs(readPreference1);
        }
Exemple #2
0
        public void WithTagSets_should_return_new_instance_when_the_value_is_not_the_same()
        {
            var tagSets1        = new[] { new TagSet(new[] { new Tag("name1", "value1") }) };
            var tagSets2        = new[] { new TagSet(new[] { new Tag("name2", "value2") }) };
            var readPreference1 = new ReadPreference(ReadPreferenceMode.Primary, tagSets1);
            var readPreference2 = readPreference1.WithTagSets(tagSets2);

            readPreference2.Should().NotBeSameAs(readPreference1);
            readPreference2.TagSets.Should().Equal(tagSets2);
        }
Exemple #3
0
        /// <summary>
        /// Parses a URL and sets all settings to match the URL.
        /// </summary>
        /// <param name="url">The URL.</param>
        public void Parse(string url)
        {
            var connectionString = new ConnectionString(url);

            _authenticationMechanism           = connectionString.AuthMechanism;
            _authenticationMechanismProperties = connectionString.AuthMechanismProperties.ToDictionary(x => x.Key, x => x.Value, StringComparer.InvariantCultureIgnoreCase);
            _authenticationSource = connectionString.AuthSource;
            switch (connectionString.Connect)
            {
            case ClusterConnectionMode.Direct:
                _connectionMode = Driver.ConnectionMode.Direct;
                break;

            case ClusterConnectionMode.ReplicaSet:
                _connectionMode = Driver.ConnectionMode.ReplicaSet;
                break;

            case ClusterConnectionMode.Sharded:
                _connectionMode = Driver.ConnectionMode.ShardRouter;
                break;

            case ClusterConnectionMode.Standalone:
                _connectionMode = Driver.ConnectionMode.Standalone;
                break;

            default:
                _connectionMode = Driver.ConnectionMode.Automatic;
                break;
            }
            _connectTimeout     = connectionString.ConnectTimeout.GetValueOrDefault(MongoDefaults.ConnectTimeout);
            _databaseName       = connectionString.DatabaseName;
            _fsync              = connectionString.FSync;
            _guidRepresentation = connectionString.UuidRepresentation.GetValueOrDefault(MongoDefaults.GuidRepresentation);
            _ipv6    = connectionString.Ipv6.GetValueOrDefault(false);
            _journal = connectionString.Journal;
            _maxConnectionIdleTime = connectionString.MaxIdleTime.GetValueOrDefault(MongoDefaults.MaxConnectionIdleTime);
            _maxConnectionLifeTime = connectionString.MaxLifeTime.GetValueOrDefault(MongoDefaults.MaxConnectionLifeTime);
            _maxConnectionPoolSize = connectionString.MaxPoolSize.GetValueOrDefault(MongoDefaults.MaxConnectionPoolSize);
            _minConnectionPoolSize = connectionString.MinPoolSize.GetValueOrDefault(MongoDefaults.MinConnectionPoolSize);
            _password = connectionString.Password;
            if (connectionString.ReadPreference != null)
            {
                _readPreference = new ReadPreference(connectionString.ReadPreference.Value);
            }
            if (connectionString.ReadPreferenceTags != null)
            {
                if (_readPreference == null)
                {
                    _readPreference = ReadPreference.Primary;
                }
                _readPreference = _readPreference.WithTagSets(connectionString.ReadPreferenceTags);
            }

            _replicaSetName             = connectionString.ReplicaSet;
            _secondaryAcceptableLatency = connectionString.SecondaryAcceptableLatency.GetValueOrDefault(MongoDefaults.SecondaryAcceptableLatency);
            _servers = connectionString.Hosts.Select(endPoint =>
            {
                DnsEndPoint dnsEndPoint;
                IPEndPoint ipEndPoint;
                if ((dnsEndPoint = endPoint as DnsEndPoint) != null)
                {
                    return(new MongoServerAddress(dnsEndPoint.Host, dnsEndPoint.Port));
                }
                else if ((ipEndPoint = endPoint as IPEndPoint) != null)
                {
                    return(new MongoServerAddress(ipEndPoint.Address.ToString(), ipEndPoint.Port));
                }
                else
                {
                    throw new NotSupportedException("Only DnsEndPoint and IPEndPoints are supported in the connection string.");
                }
            });
            _socketTimeout        = connectionString.SocketTimeout.GetValueOrDefault(MongoDefaults.SocketTimeout);
            _username             = connectionString.Username;
            _useSsl               = connectionString.Ssl.GetValueOrDefault(false);
            _verifySslCertificate = connectionString.SslVerifyCertificate.GetValueOrDefault(true);
            _w = connectionString.W;
            if (connectionString.WaitQueueSize != null)
            {
                _waitQueueSize     = connectionString.WaitQueueSize.Value;
                _waitQueueMultiple = 0.0;
            }
            else if (connectionString.WaitQueueMultiple != null)
            {
                _waitQueueMultiple = connectionString.WaitQueueMultiple.Value;
                _waitQueueSize     = 0;
            }
            _waitQueueTimeout = connectionString.WaitQueueTimeout.GetValueOrDefault(MongoDefaults.WaitQueueTimeout);
            _wTimeout         = connectionString.WTimeout;
        }
        /// <summary>
        /// Parses a URL and sets all settings to match the URL.
        /// </summary>
        /// <param name="url">The URL.</param>
        public void Parse(string url)
        {
            const string serverPattern = @"((\[[^]]+?\]|[^:,/?#]+)(:\d+)?)";
            const string pattern       =
                @"^mongodb://" +
                @"((?<username>[^:]+)(:(?<password>.*?))?@)?" +
                @"(?<servers>" + serverPattern + @"(," + serverPattern + ")*)?" +
                @"(/(?<database>[^?]+)?(\?(?<query>.*))?)?$";
            Match match = Regex.Match(url, pattern);

            if (match.Success)
            {
                var usernameGroup = match.Groups["username"];
                if (usernameGroup.Success)
                {
                    _username = Uri.UnescapeDataString(usernameGroup.Value);
                }
                var passwordGroup = match.Groups["password"];
                if (passwordGroup.Success)
                {
                    _password = Uri.UnescapeDataString(passwordGroup.Value);
                }
                string servers       = match.Groups["servers"].Value;
                var    databaseGroup = match.Groups["database"];
                if (databaseGroup.Success)
                {
                    _databaseName = databaseGroup.Value;
                }
                string query = match.Groups["query"].Value;

                if (servers != "")
                {
                    List <MongoServerAddress> addresses = new List <MongoServerAddress>();
                    foreach (string server in servers.Split(','))
                    {
                        var address = MongoServerAddress.Parse(server);
                        addresses.Add(address);
                    }
                    _servers = addresses;
                }

                if (!string.IsNullOrEmpty(query))
                {
                    foreach (var pair in query.Split('&', ';'))
                    {
                        var parts = pair.Split('=');
                        if (parts.Length != 2)
                        {
                            throw new FormatException(string.Format("Invalid connection string '{0}'.", parts));
                        }
                        var name  = parts[0];
                        var value = parts[1];

                        switch (name.ToLower())
                        {
                        case "authmechanism":
                            _authenticationMechanism = value;
                            break;

                        case "authsource":
                            _authenticationSource = value;
                            break;

                        case "connect":
                            ConnectionMode = ParseConnectionMode(name, value);
                            break;

                        case "connecttimeout":
                        case "connecttimeoutms":
                            ConnectTimeout = ParseTimeSpan(name, value);
                            break;

                        case "fsync":
                            FSync = ParseBoolean(name, value);
                            break;

                        case "gssapiservicename":
                            _gssapiServiceName = value;
                            break;

                        case "guids":
                        case "uuidrepresentation":
                            GuidRepresentation = (GuidRepresentation)Enum.Parse(typeof(GuidRepresentation), value, true);     // ignoreCase
                            break;

                        case "ipv6":
                            IPv6 = ParseBoolean(name, value);
                            break;

                        case "j":
                        case "journal":
                            Journal = ParseBoolean(name, value);
                            break;

                        case "maxidletime":
                        case "maxidletimems":
                            MaxConnectionIdleTime = ParseTimeSpan(name, value);
                            break;

                        case "maxlifetime":
                        case "maxlifetimems":
                            MaxConnectionLifeTime = ParseTimeSpan(name, value);
                            break;

                        case "maxpoolsize":
                            MaxConnectionPoolSize = ParseInt32(name, value);
                            break;

                        case "minpoolsize":
                            MinConnectionPoolSize = ParseInt32(name, value);
                            break;

                        case "readpreference":
                            if (_readPreference == null)
                            {
                                _readPreference = new ReadPreference(ReadPreferenceMode.Primary);
                            }
                            _readPreference = _readPreference.WithMode(ParseReadPreferenceMode(name, value));
                            break;

                        case "readpreferencetags":
                            if (_readPreference == null)
                            {
                                _readPreference = new ReadPreference(ReadPreferenceMode.Primary);
                            }
                            _readPreference = _readPreference.WithTagSets(_readPreference.TagSets.Concat(new[] { ParseReplicaSetTagSet(name, value) }));
                            break;

                        case "replicaset":
                            ReplicaSetName = value;
                            break;

                        case "safe":
                            var safe = Convert.ToBoolean(value);
                            if (_w == null)
                            {
                                W = safe ? 1 : 0;
                            }
                            else
                            {
                                if (safe)
                                {
                                    // don't overwrite existing W value unless it's 0
                                    var wCount = _w as WriteConcern.WCount;
                                    if (wCount != null && wCount.Value == 0)
                                    {
                                        W = 1;
                                    }
                                }
                                else
                                {
                                    W = 0;
                                }
                            }
                            break;

                        case "secondaryacceptablelatency":
                        case "secondaryacceptablelatencyms":
                            SecondaryAcceptableLatency = ParseTimeSpan(name, value);
                            break;

                        case "slaveok":
                            if (_readPreference != null)
                            {
                                throw new InvalidOperationException("SlaveOk cannot be set because ReadPreference already has a value.");
                            }
                            _slaveOk = ParseBoolean(name, value);
                            break;

                        case "sockettimeout":
                        case "sockettimeoutms":
                            SocketTimeout = ParseTimeSpan(name, value);
                            break;

                        case "ssl":
                            UseSsl = ParseBoolean(name, value);
                            break;

                        case "sslverifycertificate":
                            VerifySslCertificate = ParseBoolean(name, value);
                            break;

                        case "w":
                            W = WriteConcern.WValue.Parse(value);
                            break;

                        case "waitqueuemultiple":
                            WaitQueueMultiple = ParseDouble(name, value);
                            break;

                        case "waitqueuesize":
                            WaitQueueSize = ParseInt32(name, value);
                            break;

                        case "waitqueuetimeout":
                        case "waitqueuetimeoutms":
                            WaitQueueTimeout = ParseTimeSpan(name, value);
                            break;

                        case "wtimeout":
                        case "wtimeoutms":
                            WTimeout = ParseTimeSpan(name, value);
                            break;

                        default:
                            var message = string.Format("Invalid option '{0}'.", name);
                            throw new ArgumentException(message, "url");
                        }
                    }
                }
            }
            else
            {
                throw new FormatException(string.Format("Invalid connection string '{0}'.", url));
            }
        }