in MySQL.Data/src/X/XDevAPI/BaseSession.cs [272:332]
internal BaseSession(object connectionData, Client client = null) : this()
{
if (connectionData == null)
throw new ArgumentNullException("connectionData");
_client = client;
if (client == null)
FailoverManager.Reset();
var values = Tools.GetDictionaryFromAnonymous(connectionData);
if (!values.Keys.Any(s => s.ToLowerInvariant() == PORT_CONNECTION_OPTION_KEYWORD))
values.Add(PORT_CONNECTION_OPTION_KEYWORD, X_PROTOCOL_DEFAULT_PORT);
bool hostsParsed = false;
foreach (var value in values)
{
if (!Settings.ContainsKey(value.Key))
throw new KeyNotFoundException(string.Format(ResourcesX.InvalidConnectionStringAttribute, value.Key));
Settings.SetValue(value.Key, value.Value);
if (!hostsParsed && !string.IsNullOrEmpty(Settings[SERVER_CONNECTION_OPTION_KEYWORD].ToString()))
{
var server = value.Value.ToString();
if (IsUnixSocket(server))
Settings.SetValue(value.Key, server = NormalizeUnixSocket(server));
FailoverManager.ParseHostList(server, true, false);
if (FailoverManager.FailoverGroup != null && FailoverManager.FailoverGroup.Hosts?.Count > 1)
Settings[SERVER_CONNECTION_OPTION_KEYWORD] = null;
else if (FailoverManager.FailoverGroup != null)
Settings[SERVER_CONNECTION_OPTION_KEYWORD] = FailoverManager.FailoverGroup.Hosts[0].Host;
hostsParsed = true;
}
}
this._connectionString = Settings.ToString();
Settings.AnalyzeConnectionString(this._connectionString, true, _isDefaultPort);
if (FailoverManager.FailoverGroup != null && FailoverManager.FailoverGroup.Hosts?.Count > 1)
{
// Multiple hosts were specified.
_internalSession = FailoverManager.AttemptConnectionXProtocol(this._connectionString, out this._connectionString, _isDefaultPort, client);
Settings.ConnectionString = _connectionString;
}
else
{
if (Settings.DnsSrv)
{
var dnsSrvRecords = DnsSrv.GetDnsSrvRecords(Settings.Server);
FailoverManager.SetHostList(dnsSrvRecords.ConvertAll(r => new FailoverServer(r.Target, r.Port, null)),
FailoverMethod.Sequential);
_internalSession = FailoverManager.AttemptConnectionXProtocol(this._connectionString, out this._connectionString, _isDefaultPort, client);
Settings.ConnectionString = this._connectionString;
}
else
_internalSession = InternalSession.GetSession(Settings);
}
if (!string.IsNullOrWhiteSpace(Settings.Database))
DefaultSchema = GetSchema(Settings.Database);
}