internal BaseSession()

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);
    }