Example #1
0
        // public methods
        /// <summary>
        /// Parses a URL and sets all settings to match the URL.
        /// </summary>
        /// <param name="url">The URL.</param>
        public void Parse(string url)
        {
            ResetValues();
            const string serverPattern = @"((\[[^]]+?\]|[^:,/]+)(:\d+)?)";
            const string pattern       =
                @"^mongodb://" +
                @"((?<username>[^:]+):(?<password>[^@]+)@)?" +
                @"(?<servers>" + serverPattern + "(," + serverPattern + ")*)" +
                @"(/(?<database>[^?]+)?(\?(?<query>.*))?)?$";
            Match match = Regex.Match(url, pattern);

            if (match.Success)
            {
                string username     = Uri.UnescapeDataString(match.Groups["username"].Value);
                string password     = Uri.UnescapeDataString(match.Groups["password"].Value);
                string servers      = match.Groups["servers"].Value;
                string databaseName = match.Groups["database"].Value;
                string query        = match.Groups["query"].Value;

                if (username != "" && password != "")
                {
                    _defaultCredentials = new MongoCredentials(username, password);
                }
                else
                {
                    _defaultCredentials = null;
                }

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

                _databaseName = (databaseName != "") ? databaseName : null;

                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 "connect":
                            _connectionMode = ParseConnectionMode(name, value);
                            break;

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

                        case "fsync":
                            if (_safeMode == null)
                            {
                                _safeMode = new SafeMode(false);
                            }
                            _safeMode.FSync = ParseBoolean(name, 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":
                            if (_safeMode == null)
                            {
                                _safeMode = new SafeMode(false);
                            }
                            SafeMode.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();
                            }
                            _readPreference.ReadPreferenceMode = ParseReadPreferenceMode(name, value);
                            break;

                        case "readpreferencetags":
                            if (_readPreference == null)
                            {
                                _readPreference = new ReadPreference {
                                    ReadPreferenceMode = ReadPreferenceMode.Primary
                                };
                            }
                            _readPreference.AddTagSet(ParseReplicaSetTagSet(name, value));
                            break;

                        case "replicaset":
                            _replicaSetName = value;
                            break;

                        case "safe":
                            if (_safeMode == null)
                            {
                                _safeMode = new SafeMode(false);
                            }
                            SafeMode.Enabled = ParseBoolean(name, value);
                            break;

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

                        case "slaveok":
                            _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":
                            if (_safeMode == null)
                            {
                                _safeMode = new SafeMode(false);
                            }
                            try
                            {
                                SafeMode.W = ParseInt32(name, value);
                            }
                            catch (FormatException)
                            {
                                SafeMode.WMode = value;
                            }
                            break;

                        case "waitqueuemultiple":
                            _waitQueueMultiple = ParseDouble(name, value);
                            _waitQueueSize     = 0;
                            break;

                        case "waitqueuesize":
                            _waitQueueMultiple = 0;
                            _waitQueueSize     = ParseInt32(name, value);
                            break;

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

                        case "wtimeout":
                        case "wtimeoutms":
                            if (_safeMode == null)
                            {
                                _safeMode = new SafeMode(false);
                            }
                            SafeMode.WTimeout = ParseTimeSpan(name, value);
                            break;
                        }
                    }
                }
            }
            else
            {
                throw new FormatException(string.Format("Invalid connection string '{0}'.", url));
            }
        }
        /// <summary>
        /// Parses a URL and sets all settings to match the URL.
        /// </summary>
        /// <param name="url">The URL.</param>
        public void Parse(string url)
        {
            ResetValues();
            const string serverPattern = @"((\[[^]]+?\]|[^:,/]+)(:\d+)?)";
            const string pattern       =
                @"^mongodb://" +
                @"((?<username>[^:]+):(?<password>[^@]+)@)?" +
                @"(?<servers>" + serverPattern + "(," + serverPattern + ")*)?" +
                @"(/(?<database>[^?]+)?(\?(?<query>.*))?)?$";
            Match match = Regex.Match(url, pattern);

            if (match.Success)
            {
                string username     = Uri.UnescapeDataString(match.Groups["username"].Value);
                string password     = Uri.UnescapeDataString(match.Groups["password"].Value);
                string servers      = match.Groups["servers"].Value;
                string databaseName = match.Groups["database"].Value;
                string query        = match.Groups["query"].Value;

                if (username != "" && password != "")
                {
                    _defaultCredentials = new MongoCredentials(username, password);
                }
                else
                {
                    _defaultCredentials = null;
                }

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

                _databaseName = (databaseName != "") ? databaseName : null;

                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 "connect":
                            ConnectionMode = ParseConnectionMode(name, value);
                            break;

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

                        case "fsync":
                            FSync = ParseBoolean(name, 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();
                            }
                            ReadPreference.ReadPreferenceMode = ParseReadPreferenceMode(name, value);
                            break;

                        case "readpreferencetags":
                            if (_readPreference == null)
                            {
                                _readPreference = new ReadPreference {
                                    ReadPreferenceMode = ReadPreferenceMode.Primary
                                };
                            }
                            ReadPreference.AddTagSet(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":
#pragma warning disable 618
                            SlaveOk = ParseBoolean(name, value);
#pragma warning restore
                            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));
            }
        }