Skip to content

Commit ea25b83

Browse files
committed
Add "Application Name" connection string setting. Fixes #547
1 parent ff97012 commit ea25b83

File tree

5 files changed

+35
-9
lines changed

5 files changed

+35
-9
lines changed

docs/content/connection-options.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
lastmod: 2017-11-06
2+
lastmod: 2018-08-21
33
date: 2016-10-16
44
title: Connection Options
55
weight: 30
@@ -205,6 +205,12 @@ These are the other options that MySqlConnector supports. They are set to sensib
205205
This allows the special “zero” date value `0000-00-00` to be retrieved from the database. If <code>false</code> (the default)
206206
date columns are returned as `DateTime` values, and an exception is thrown for unrepresentable dates.</td>
207207
</tr>
208+
<tr>
209+
<td>ApplicationName, Application Name</td>
210+
<td>null</td>
211+
<td>Sets the <c>program_name</c> connection attribute passed to MySQL Server. This value may be displayed by diagnostic tools,
212+
e.g., as the “Program” column in “Client Connections” in <a href="https://www.mysql.com/products/workbench/">MySQL Workbench</a>.</td>
213+
</tr>
208214
<tr>
209215
<td>Compress, Use Compression, UseCompression</td>
210216
<td>false</td>

src/MySqlConnector/Core/ConnectionSettings.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public ConnectionSettings(MySqlConnectionStringBuilder csb)
6565
AllowPublicKeyRetrieval = csb.AllowPublicKeyRetrieval;
6666
AllowUserVariables = csb.AllowUserVariables;
6767
AllowZeroDateTime = csb.AllowZeroDateTime;
68+
ApplicationName = csb.ApplicationName;
6869
AutoEnlist = csb.AutoEnlist;
6970
ConnectionTimeout = (int) csb.ConnectionTimeout;
7071
ConvertZeroDateTime = csb.ConvertZeroDateTime;
@@ -142,6 +143,7 @@ private static MySqlGuidFormat GetEffectiveGuidFormat(MySqlGuidFormat guidFormat
142143
public bool AllowPublicKeyRetrieval { get; }
143144
public bool AllowUserVariables { get; }
144145
public bool AllowZeroDateTime { get; }
146+
public string ApplicationName { get; }
145147
public bool AutoEnlist { get; }
146148
public int ConnectionTimeout { get; }
147149
public bool ConvertZeroDateTime { get; }
@@ -159,6 +161,8 @@ private static MySqlGuidFormat GetEffectiveGuidFormat(MySqlGuidFormat guidFormat
159161
public bool UseAffectedRows { get; }
160162
public bool UseCompression { get; }
161163

164+
public byte[] ConnectionAttributes { get; set; }
165+
162166
// Helper Functions
163167
int? m_connectionTimeoutMilliseconds;
164168
public int ConnectionTimeoutMilliseconds

src/MySqlConnector/Core/ServerSession.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,10 @@ public async Task ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer
328328
}
329329
} while (shouldRetrySsl);
330330

331-
if (m_supportsConnectionAttributes && s_connectionAttributes == null)
332-
s_connectionAttributes = CreateConnectionAttributes();
331+
if (m_supportsConnectionAttributes && cs.ConnectionAttributes == null)
332+
cs.ConnectionAttributes = CreateConnectionAttributes(cs.ApplicationName);
333333

334-
using (var handshakeResponsePayload = HandshakeResponse41Payload.Create(initialHandshake, cs, m_useCompression, m_supportsConnectionAttributes ? s_connectionAttributes : null))
334+
using (var handshakeResponsePayload = HandshakeResponse41Payload.Create(initialHandshake, cs, m_useCompression, m_supportsConnectionAttributes ? cs.ConnectionAttributes : null))
335335
await SendReplyAsync(handshakeResponsePayload, ioBehavior, cancellationToken).ConfigureAwait(false);
336336
payload = await ReceiveReplyAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
337337

@@ -395,7 +395,7 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, IOBehavio
395395
DatabaseOverride = null;
396396
}
397397
var hashedPassword = AuthenticationUtility.CreateAuthenticationResponse(AuthPluginData, 0, cs.Password);
398-
using (var changeUserPayload = ChangeUserPayload.Create(cs.UserID, hashedPassword, cs.Database, m_supportsConnectionAttributes ? s_connectionAttributes : null))
398+
using (var changeUserPayload = ChangeUserPayload.Create(cs.UserID, hashedPassword, cs.Database, m_supportsConnectionAttributes ? cs.ConnectionAttributes : null))
399399
await SendAsync(changeUserPayload, ioBehavior, cancellationToken).ConfigureAwait(false);
400400
var payload = await ReceiveReplyAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
401401
if (payload.HeaderByte == AuthenticationMethodSwitchRequestPayload.Signature)
@@ -1269,7 +1269,7 @@ private void VerifyState(State state1, State state2, State state3)
12691269

12701270
internal SslProtocols SslProtocol => m_sslStream?.SslProtocol ?? SslProtocols.None;
12711271

1272-
private byte[] CreateConnectionAttributes()
1272+
private byte[] CreateConnectionAttributes(string programName)
12731273
{
12741274
Log.Debug("Session{0} creating connection attributes", m_logArguments);
12751275
var attributesWriter = new ByteBufferWriter();
@@ -1298,6 +1298,11 @@ private byte[] CreateConnectionAttributes()
12981298
attributesWriter.WriteLengthEncodedString("_pid");
12991299
attributesWriter.WriteLengthEncodedString(process.Id.ToString(CultureInfo.InvariantCulture));
13001300
}
1301+
if (!string.IsNullOrEmpty(programName))
1302+
{
1303+
attributesWriter.WriteLengthEncodedString("program_name");
1304+
attributesWriter.WriteLengthEncodedString(programName);
1305+
}
13011306
using (var connectionAttributesPayload = attributesWriter.ToPayloadData())
13021307
{
13031308
var connectionAttributes = connectionAttributesPayload.ArraySegment;
@@ -1349,7 +1354,6 @@ private enum State
13491354

13501355
static readonly byte[] s_beginCertificateBytes = new byte[] { 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 67, 69, 82, 84, 73, 70, 73, 67, 65, 84, 69, 45, 45, 45, 45, 45 }; // -----BEGIN CERTIFICATE-----
13511356
static int s_lastId;
1352-
static byte[] s_connectionAttributes;
13531357
static readonly IMySqlConnectorLogger Log = MySqlConnectorLogManager.CreateLogger(nameof(ServerSession));
13541358
static readonly PayloadData s_setNamesUtf8mb4Payload = QueryPayload.Create("SET NAMES utf8mb4 COLLATE utf8mb4_bin;");
13551359

src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnectionStringBuilder.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,12 @@ public bool AllowZeroDateTime
165165
set => MySqlConnectionStringOption.AllowZeroDateTime.SetValue(this, value);
166166
}
167167

168+
public string ApplicationName
169+
{
170+
get => MySqlConnectionStringOption.ApplicationName.GetValue(this);
171+
set => MySqlConnectionStringOption.ApplicationName.SetValue(this, value);
172+
}
173+
168174
public bool AutoEnlist
169175
{
170176
get => MySqlConnectionStringOption.AutoEnlist.GetValue(this);
@@ -349,6 +355,7 @@ internal abstract class MySqlConnectionStringOption
349355
public static readonly MySqlConnectionStringOption<bool> AllowPublicKeyRetrieval;
350356
public static readonly MySqlConnectionStringOption<bool> AllowUserVariables;
351357
public static readonly MySqlConnectionStringOption<bool> AllowZeroDateTime;
358+
public static readonly MySqlConnectionStringOption<string> ApplicationName;
352359
public static readonly MySqlConnectionStringOption<bool> AutoEnlist;
353360
public static readonly MySqlConnectionStringOption<string> CharacterSet;
354361
public static readonly MySqlConnectionStringOption<uint> ConnectionTimeout;
@@ -494,6 +501,10 @@ static MySqlConnectionStringOption()
494501
keys: new[] { "AllowZeroDateTime", "Allow Zero DateTime" },
495502
defaultValue: false));
496503

504+
AddOption(ApplicationName = new MySqlConnectionStringOption<string>(
505+
keys: new[] { "ApplicationName", "Application Name" },
506+
defaultValue: null));
507+
497508
AddOption(AutoEnlist = new MySqlConnectionStringOption<bool>(
498509
keys: new[] { "AutoEnlist", "Auto Enlist" },
499510
defaultValue: true));

tests/MySqlConnector.Tests/MySqlConnectionStringBuilderTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,11 @@ public void Defaults()
3434
Assert.Equal("", csb.Database);
3535
Assert.Equal(30u, csb.DefaultCommandTimeout);
3636
#if !BASELINE
37+
Assert.Null(csb.ApplicationName);
3738
Assert.Equal(0u, csb.ConnectionIdlePingTime);
3839
Assert.Equal(180u, csb.ConnectionIdleTimeout);
3940
Assert.False(csb.ForceSynchronous);
40-
#if !BASELINE
4141
Assert.Equal(MySqlGuidFormat.Default, csb.GuidFormat);
42-
#endif
4342
Assert.False(csb.IgnoreCommandTransaction);
4443
Assert.Null(csb.CACertificateFile);
4544
Assert.Equal(MySqlLoadBalance.RoundRobin, csb.LoadBalance);
@@ -100,6 +99,7 @@ public void ParseConnectionString()
10099
#endif
101100
"default command timeout=123;" +
102101
#if !BASELINE
102+
"application name=My Test Application;" +
103103
"connection idle ping time=60;" +
104104
"connectionidletimeout=30;" +
105105
"forcesynchronous=true;" +
@@ -146,6 +146,7 @@ public void ParseConnectionString()
146146
Assert.Equal("schema_name", csb.Database);
147147
Assert.Equal(123u, csb.DefaultCommandTimeout);
148148
#if !BASELINE
149+
Assert.Equal("My Test Application", csb.ApplicationName);
149150
Assert.Equal(60u, csb.ConnectionIdlePingTime);
150151
Assert.Equal(30u, csb.ConnectionIdleTimeout);
151152
Assert.True(csb.ForceSynchronous);

0 commit comments

Comments
 (0)