Serialize Connection String (#680)

* add string serialization

* add unadded file

* changed code to be testable, added test

* moved test to correct location

* change to send undefined rather than error if the serialization fails

* update request name
This commit is contained in:
Anthony Dresser
2018-08-16 13:10:14 -07:00
committed by GitHub
parent df3c312984
commit 3c0a282333
3 changed files with 102 additions and 0 deletions

View File

@@ -952,6 +952,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
serviceHost.SetRequestHandler(ListDatabasesRequest.Type, HandleListDatabasesRequest);
serviceHost.SetRequestHandler(ChangeDatabaseRequest.Type, HandleChangeDatabaseRequest);
serviceHost.SetRequestHandler(GetConnectionStringRequest.Type, HandleGetConnectionStringRequest);
serviceHost.SetRequestHandler(BuildConnectionInfoRequest.Type, HandleBuildConnectionInfoRequest);
}
/// <summary>
@@ -1288,6 +1289,64 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
});
}
/// <summary>
/// Handles a request to serialize a connection string
/// </summary>
public async Task HandleBuildConnectionInfoRequest(
string connectionString,
RequestContext<ConnectionDetails> requestContext)
{
await Task.Run(async () =>
{
try
{
await requestContext.SendResult(ParseConnectionString(connectionString));
}
catch (Exception e)
{
// If theres an error in the parse, it means we just can't parse, so we return undefined
// rather than an error.
await requestContext.SendResult(null);
}
});
}
public ConnectionDetails ParseConnectionString(string connectionString)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
ConnectionDetails details = new ConnectionDetails()
{
ApplicationIntent = builder.ApplicationIntent.ToString(),
ApplicationName = builder.ApplicationName,
AttachDbFilename = builder.AttachDBFilename,
AuthenticationType = builder.IntegratedSecurity ? "Integrated" : "SqlLogin",
ConnectRetryCount = builder.ConnectRetryCount,
ConnectRetryInterval = builder.ConnectRetryInterval,
ConnectTimeout = builder.ConnectTimeout,
CurrentLanguage = builder.CurrentLanguage,
DatabaseName = builder.InitialCatalog,
Encrypt = builder.Encrypt,
FailoverPartner = builder.FailoverPartner,
LoadBalanceTimeout = builder.LoadBalanceTimeout,
MaxPoolSize = builder.MaxPoolSize,
MinPoolSize = builder.MinPoolSize,
MultipleActiveResultSets = builder.MultipleActiveResultSets,
MultiSubnetFailover = builder.MultiSubnetFailover,
PacketSize = builder.PacketSize,
Password = !builder.IntegratedSecurity ? builder.Password : string.Empty,
PersistSecurityInfo = builder.PersistSecurityInfo,
Pooling = builder.Pooling,
Replication = builder.Replication,
ServerName = builder.DataSource,
TrustServerCertificate = builder.TrustServerCertificate,
TypeSystemVersion = builder.TypeSystemVersion,
UserName = builder.UserID,
WorkstationId = builder.WorkstationID,
};
return details;
}
/// <summary>
/// Handles a request to change the database for a connection
/// </summary>

View File

@@ -0,0 +1,19 @@
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
using Microsoft.SqlTools.Hosting.Protocol.Contracts;
namespace Microsoft.SqlTools.ServiceLayer.Connection.Contracts
{
/// <summary>
/// Serialize Connection String request
/// </summary>
public class BuildConnectionInfoRequest
{
public static readonly
RequestType<string, ConnectionDetails> Type =
RequestType<string, ConnectionDetails>.Create("connection/buildconnectioninfo");
}
}

View File

@@ -1460,5 +1460,29 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
Assert.Equal(defaultDbName, dbName);
}
/// <summary>
/// Test ParseConnectionString
/// </summary>
[Fact]
public void ParseConnectionStringTest()
{
// If we make a connection to a live database
ConnectionService service = ConnectionService.Instance;
var connectionString = "Server=tcp:{servername},1433;Initial Catalog={databasename};Persist Security Info=False;User ID={your_username};Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";
var details = service.ParseConnectionString(connectionString);
Assert.Equal("tcp:{servername},1433", details.ServerName);
Assert.Equal("{databasename}", details.DatabaseName);
Assert.Equal("{your_username}", details.UserName);
Assert.Equal("{your_password}", details.Password);
Assert.Equal(false, details.PersistSecurityInfo);
Assert.Equal(false, details.MultipleActiveResultSets);
Assert.Equal(true, details.Encrypt);
Assert.Equal(false, details.TrustServerCertificate);
Assert.Equal(30, details.ConnectTimeout);
}
}
}