mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-17 02:51:45 -05:00
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:
@@ -952,6 +952,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection
|
|||||||
serviceHost.SetRequestHandler(ListDatabasesRequest.Type, HandleListDatabasesRequest);
|
serviceHost.SetRequestHandler(ListDatabasesRequest.Type, HandleListDatabasesRequest);
|
||||||
serviceHost.SetRequestHandler(ChangeDatabaseRequest.Type, HandleChangeDatabaseRequest);
|
serviceHost.SetRequestHandler(ChangeDatabaseRequest.Type, HandleChangeDatabaseRequest);
|
||||||
serviceHost.SetRequestHandler(GetConnectionStringRequest.Type, HandleGetConnectionStringRequest);
|
serviceHost.SetRequestHandler(GetConnectionStringRequest.Type, HandleGetConnectionStringRequest);
|
||||||
|
serviceHost.SetRequestHandler(BuildConnectionInfoRequest.Type, HandleBuildConnectionInfoRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <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>
|
/// <summary>
|
||||||
/// Handles a request to change the database for a connection
|
/// Handles a request to change the database for a connection
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1460,5 +1460,29 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
|
|||||||
|
|
||||||
Assert.Equal(defaultDbName, dbName);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user