From 7c96ceb5013bdbbe0ae9d5b90367ed4e8218aeb5 Mon Sep 17 00:00:00 2001 From: Karl Burtram Date: Wed, 25 Jul 2018 15:03:00 -0400 Subject: [PATCH] Get Connection String request handler (#665) --- .../Connection/ConnectionService.cs | 34 +++++++++++++++++-- .../Contracts/GetConnectionStringParams.cs | 18 ++++++++++ .../Contracts/GetConnectionStringRequest.cs | 19 +++++++++++ .../Connection/ConnectionServiceTests.cs | 24 +++++++++++-- 4 files changed, 90 insertions(+), 5 deletions(-) create mode 100644 src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringParams.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringRequest.cs diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs index ee0f0730..534e7b89 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs @@ -14,11 +14,11 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.SqlTools.Hosting.Protocol; +using Microsoft.SqlServer.Management.Common; using Microsoft.SqlTools.ServiceLayer.Connection.Contracts; using Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection; using Microsoft.SqlTools.ServiceLayer.LanguageServices; using Microsoft.SqlTools.ServiceLayer.LanguageServices.Contracts; -using Microsoft.SqlServer.Management.Common; using Microsoft.SqlTools.ServiceLayer.Utility; using Microsoft.SqlTools.Utility; @@ -949,7 +949,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection serviceHost.SetRequestHandler(CancelConnectRequest.Type, HandleCancelConnectRequest); serviceHost.SetRequestHandler(DisconnectRequest.Type, HandleDisconnectRequest); serviceHost.SetRequestHandler(ListDatabasesRequest.Type, HandleListDatabasesRequest); - serviceHost.SetRequestHandler(ChangeDatabaseRequest.Type, HandleChangeDatabase); + serviceHost.SetRequestHandler(ChangeDatabaseRequest.Type, HandleChangeDatabaseRequest); + serviceHost.SetRequestHandler(GetConnectionStringRequest.Type, HandleGetConnectionStringRequest); } /// @@ -1252,10 +1253,37 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection return connectionBuilder; } + /// + /// Handles a request to get a connection string for the provided connection + /// + public async Task HandleGetConnectionStringRequest( + GetConnectionStringParams connStringParams, + RequestContext requestContext) + { + await Task.Run(async () => + { + string connectionString = string.Empty; + ConnectionInfo info; + if (TryFindConnection(connStringParams.OwnerUri, out info)) + { + try + { + connectionString = BuildConnectionString(info.ConnectionDetails); + } + catch (Exception e) + { + await requestContext.SendError(e.ToString()); + } + } + + await requestContext.SendResult(connectionString); + }); + } + /// /// Handles a request to change the database for a connection /// - public async Task HandleChangeDatabase( + public async Task HandleChangeDatabaseRequest( ChangeDatabaseParams changeDatabaseParams, RequestContext requestContext) { diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringParams.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringParams.cs new file mode 100644 index 00000000..5d8d0f43 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringParams.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.Connection.Contracts +{ + /// + /// Parameters for the Get Connection String Request. + /// + public class GetConnectionStringParams + { + /// + /// URI of the owner of the connection + /// + public string OwnerUri { get; set; } + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringRequest.cs new file mode 100644 index 00000000..07ed4e29 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringRequest.cs @@ -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 +{ + /// + /// Get Connection String request + /// + public class GetConnectionStringRequest + { + public static readonly + RequestType Type = + RequestType.Create("connection/getconnectionstring"); + } +} diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Connection/ConnectionServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Connection/ConnectionServiceTests.cs index cc00e437..4a3bb506 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Connection/ConnectionServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Connection/ConnectionServiceTests.cs @@ -7,10 +7,11 @@ using System.Data.Common; using Microsoft.SqlTools.ServiceLayer.Connection; using Microsoft.SqlTools.ServiceLayer.Connection.Contracts; using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility; -using Microsoft.SqlTools.ServiceLayer.Test.Common; -using Xunit; using Microsoft.SqlTools.ServiceLayer.QueryExecution; using Microsoft.SqlTools.ServiceLayer.SqlContext; +using Microsoft.SqlTools.ServiceLayer.Test.Common; +using Moq; +using Xunit; namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Connection { @@ -103,5 +104,24 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Connection } } } + + /// + /// Test HandleGetConnectionStringRequest + /// + [Fact] + public async void GetCurrentConnectionStringTest() + { + // If we make a connection to a live database + ConnectionService service = ConnectionService.Instance; + var result = LiveConnectionHelper.InitLiveConnectionInfo(); + var requestContext = new Mock>(); + var requestParams = new GetConnectionStringParams() + { + OwnerUri = result.ConnectionInfo.OwnerUri + }; + + await service.HandleGetConnectionStringRequest(requestParams, requestContext.Object); + requestContext.VerifyAll(); + } } }