public override string ToString()
{
StringBuilder url = new StringBuilder();
url.Append("mongodb://");
if (_defaultCredentials != null)
{
url.AppendFormat("{0}:{1}@", Uri.EscapeDataString(_defaultCredentials.Username), Uri.EscapeDataString(_defaultCredentials.Password));
}
if (_servers != null)
{
bool firstServer = true;
foreach (MongoServerAddress server in _servers)
{
if (!firstServer) { url.Append(","); }
if (server.Port == 27017)
{
url.Append(server.Host);
}
else
{
url.AppendFormat("{0}:{1}", server.Host, server.Port);
}
firstServer = false;
}
}
if (_databaseName != null)
{
url.Append("/");
url.Append(_databaseName);
}
var query = new StringBuilder();
if (_ipv6)
{
query.AppendFormat("ipv6=true;");
}
if (_useSsl)
{
query.AppendFormat("ssl=true;");
}
if (!_verifySslCertificate)
{
query.AppendFormat("sslVerifyCertificate=false;");
}
if (_connectionMode != ConnectionMode.Automatic)
{
query.AppendFormat("connect={0};", MongoUtils.ToCamelCase(_connectionMode.ToString()));
}
if (!string.IsNullOrEmpty(_replicaSetName))
{
query.AppendFormat("replicaSet={0};", _replicaSetName);
}
if (_slaveOk.HasValue)
{
query.AppendFormat("slaveOk={0};", _slaveOk.Value ? "true" : "false"); // note: bool.ToString() returns "True" and "False"
}
if (_readPreference != null)
{
query.AppendFormat("readPreference={0};", MongoUtils.ToCamelCase(_readPreference.ReadPreferenceMode.ToString()));
if (_readPreference.TagSets != null)
{
foreach (var tagSet in _readPreference.TagSets)
{
query.AppendFormat("readPreferenceTags={0};", string.Join(",", tagSet.Select(t => string.Format("{0}:{1}", t.Name, t.Value)).ToArray()));
}
}
}
if (_fsync != null)
{
query.AppendFormat("fsync={0};", XmlConvert.ToString(_fsync.Value));
}
if (_journal != null)
{
query.AppendFormat("journal={0};", XmlConvert.ToString(_journal.Value));
}
if (_w != null)
{
query.AppendFormat("w={0};", _w);
}
if (_wTimeout != null)
{
query.AppendFormat("wtimeout={0};", FormatTimeSpan(_wTimeout.Value));
}
if (_connectTimeout != MongoDefaults.ConnectTimeout)
{
query.AppendFormat("connectTimeout={0};", FormatTimeSpan(_connectTimeout));
}
if (_maxConnectionIdleTime != MongoDefaults.MaxConnectionIdleTime)
{
query.AppendFormat("maxIdleTime={0};", FormatTimeSpan(_maxConnectionIdleTime));
}
if (_maxConnectionLifeTime != MongoDefaults.MaxConnectionLifeTime)
{
query.AppendFormat("maxLifeTime={0};", FormatTimeSpan(_maxConnectionLifeTime));
}
if (_maxConnectionPoolSize != MongoDefaults.MaxConnectionPoolSize)
{
query.AppendFormat("maxPoolSize={0};", _maxConnectionPoolSize);
}
if (_minConnectionPoolSize != MongoDefaults.MinConnectionPoolSize)
{
query.AppendFormat("minPoolSize={0};", _minConnectionPoolSize);
}
if (_secondaryAcceptableLatency != MongoDefaults.SecondaryAcceptableLatency)
{
query.AppendFormat("secondaryAcceptableLatency={0};", FormatTimeSpan(_secondaryAcceptableLatency));
}
if (_socketTimeout != MongoDefaults.SocketTimeout)
{
query.AppendFormat("socketTimeout={0};", FormatTimeSpan(_socketTimeout));
}
if (_waitQueueMultiple != 0.0 && _waitQueueMultiple != MongoDefaults.WaitQueueMultiple)
{
query.AppendFormat("waitQueueMultiple={0};", _waitQueueMultiple);
}
if (_waitQueueSize != 0 && _waitQueueSize != MongoDefaults.WaitQueueSize)
{
query.AppendFormat("waitQueueSize={0};", _waitQueueSize);
}
if (_waitQueueTimeout != MongoDefaults.WaitQueueTimeout)
{
query.AppendFormat("waitQueueTimeout={0};", FormatTimeSpan(WaitQueueTimeout));
}
if (_guidRepresentation != MongoDefaults.GuidRepresentation)
{
query.AppendFormat("uuidRepresentation={0};", (_guidRepresentation == GuidRepresentation.CSharpLegacy) ? "csharpLegacy" : MongoUtils.ToCamelCase(_guidRepresentation.ToString()));
}
if (query.Length != 0)
{
query.Length = query.Length - 1; // remove trailing ";"
if (_databaseName == null)
{
url.Append("/");
}
url.Append("?");
url.Append(query.ToString());
}
return url.ToString();
}