in MySQL.Data/src/X/XDevAPI/BaseSession.cs [624:688]
private string ConvertToConnectionString(Uri uri, string unixSocketPath, bool parseServerAsUnixSocket, bool isDnsSrvScheme)
{
List<string> connectionParts = new List<string>();
if (string.IsNullOrWhiteSpace(uri.Host))
throw new UriFormatException(ResourcesX.InvalidUriData + "host");
connectionParts.Add("server=" + (parseServerAsUnixSocket ?
NormalizeUnixSocket(unixSocketPath) :
uri.Host));
connectionParts.Add("port=" + (uri.Port == -1 ? 33060 : uri.Port));
_isDefaultPort = uri.IsDefaultPort;
if (uri.Scheme == DNS_SRV_URI_SCHEME)
connectionParts.Add("dns-srv=true");
if (!string.IsNullOrWhiteSpace(uri.UserInfo))
{
string[] userData = uri.UserInfo.Split(':');
if (userData.Length > 2)
throw new UriFormatException(ResourcesX.InvalidUriData + "user info");
connectionParts.Add("uid=" + System.Uri.UnescapeDataString(userData[0]));
if (userData.Length > 1)
connectionParts.Add("password=" + System.Uri.UnescapeDataString(userData[1]));
}
if (uri.Segments.Length > 2)
throw new UriFormatException(ResourcesX.InvalidUriData + "segments");
if (uri.Segments.Length > 1)
{
connectionParts.Add("database=" + System.Uri.UnescapeDataString(uri.Segments[1]));
}
if (!string.IsNullOrWhiteSpace(uri.Query))
{
string[] queries = System.Uri.UnescapeDataString(uri.Query).Substring(1).Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string query in queries)
{
string[] keyValue = query.Replace(";", string.Empty).Split('=');
string part;
var connectionAttributesOption = MySqlXConnectionStringBuilder.Options.Options.First(item => item.Keyword == CONNECTION_ATTRIBUTES_CONNECTION_OPTION_KEYWORD);
var dnsSrvOption = MySqlXConnectionStringBuilder.Options.Options.First(item => item.Keyword == DNS_SRV_CONNECTION_OPTION_KEYWORD);
if (!((connectionAttributesOption.Keyword == keyValue[0]) || connectionAttributesOption.Synonyms.Contains(keyValue[0]) && keyValue.Count() > 2))
{
if (keyValue.Length > 2)
throw new ArgumentException(ResourcesX.InvalidUriQuery + ":" + keyValue[0]);
var connecttimeoutOption = MySqlXConnectionStringBuilder.Options.Options.First(item => item.Keyword == CONNECT_TIMEOUT_CONNECTION_OPTION_KEYWORD);
if ((connecttimeoutOption.Keyword == keyValue[0] || connecttimeoutOption.Synonyms.Contains(keyValue[0])) &&
String.IsNullOrWhiteSpace(keyValue[1]))
throw new FormatException(ResourcesX.InvalidConnectionTimeoutValue);
part = keyValue[0] + "=" + (keyValue.Length == 2 ? keyValue[1] : "true").Replace("(", string.Empty).Replace(")", string.Empty);
}
else if (keyValue[1] == string.Empty)
throw new MySqlException(ResourcesX.InvalidUriQuery + ": " + keyValue[0]);
else
part = keyValue[0] + "=" + query.Replace(keyValue[0] + "=", string.Empty);
if (isDnsSrvScheme && (dnsSrvOption.Keyword == keyValue[0] || dnsSrvOption.Synonyms.Contains(keyValue[0])) && !Convert.ToBoolean(keyValue[1]))
throw new ArgumentException(string.Format(ResourcesX.DnsSrvConflictingOptions, dnsSrvOption.Keyword));
else if (isDnsSrvScheme && (dnsSrvOption.Keyword == keyValue[0] || dnsSrvOption.Synonyms.Contains(keyValue[0])))
continue;
connectionParts.Add(part);
}
}
return string.Join("; ", connectionParts);
}