diff --git a/docs/guide/jsonrpc_protocol.md b/docs/guide/jsonrpc_protocol.md index b78d2eaa..c4033dcd 100644 --- a/docs/guide/jsonrpc_protocol.md +++ b/docs/guide/jsonrpc_protocol.md @@ -532,7 +532,11 @@ Get a connection string for the provided connection. /// public string OwnerUri { get; set; } + /// Connection info of the connection + /// + public ConnectionDetails ConnectionDetails { get; set; } /// + /// Indicates whether the password should be return in the connection string. Default is false. /// public bool IncludePassword { get; set; } diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs index f30fc5a6..1be5e7db 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs @@ -1317,27 +1317,34 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection { string connectionString = string.Empty; ConnectionInfo info; - if (TryFindConnection(connStringParams.OwnerUri, out info)) + SqlConnectionStringBuilder connStringBuilder; + try + { + // set connection string using connection uri if connection details are undefined + if (connStringParams.ConnectionDetails == null) + { + TryFindConnection(connStringParams.OwnerUri, out info); + connStringBuilder = CreateConnectionStringBuilder(info.ConnectionDetails); + } + // set connection string using connection details + else + { + connStringBuilder = CreateConnectionStringBuilder(connStringParams.ConnectionDetails as ConnectionDetails); + } + if (!connStringParams.IncludePassword) + { + connStringBuilder.Password = ConnectionService.PasswordPlaceholder; + } + // default connection string application name to always be included unless set to false + if (!connStringParams.IncludeApplicationName.HasValue || connStringParams.IncludeApplicationName.Value == true) + { + connStringBuilder.ApplicationName = "sqlops-connection-string"; + } + connectionString = connStringBuilder.ConnectionString; + } + catch (Exception e) { - try - { - SqlConnectionStringBuilder connStringBuilder = CreateConnectionStringBuilder(info.ConnectionDetails); - - if (!connStringParams.IncludePassword) - { - connStringBuilder.Password = ConnectionService.PasswordPlaceholder; - } - // default connection string application name to always be included unless set to false - if (!connStringParams.IncludeApplicationName.HasValue || connStringParams.IncludeApplicationName.Value == true) - { - connStringBuilder.ApplicationName = "sqlops-connection-string"; - } - connectionString = connStringBuilder.ConnectionString; - } - catch (Exception e) - { - await requestContext.SendError(e.ToString()); - } + await requestContext.SendError(e.ToString()); } await requestContext.SendResult(connectionString); diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringParams.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringParams.cs index 8d151405..e5d944f5 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringParams.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/Contracts/GetConnectionStringParams.cs @@ -15,6 +15,11 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection.Contracts /// public string OwnerUri { get; set; } + /// + /// Connection information of the connection + /// + public ConnectionDetails ConnectionDetails { get; set; } + /// /// Indicates whether the password should be return in the connection string /// default is set to false @@ -25,6 +30,6 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection.Contracts /// Indicates whether the application name should be return in the connection string /// default is set to true /// - public bool? IncludeApplicationName { get; set;} + public bool? IncludeApplicationName { get; set; } } } diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Connection/ConnectionServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Connection/ConnectionServiceTests.cs index a8f3d568..8267c1b1 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Connection/ConnectionServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/Connection/ConnectionServiceTests.cs @@ -124,6 +124,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Connection var requestParams = new GetConnectionStringParams() { OwnerUri = result.ConnectionInfo.OwnerUri, + ConnectionDetails = null, IncludePassword = false, IncludeApplicationName = true }; @@ -154,11 +155,12 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Connection var resultApplicationName = result.ConnectionInfo.ConnectionDetails.ApplicationName; var requestContext = new Mock>(); - requestContext.Setup(x => x.SendResult(It.Is((connectionString) => !connectionString.Contains("Application Name="+ resultApplicationName)))) + requestContext.Setup(x => x.SendResult(It.Is((connectionString) => !connectionString.Contains("Application Name=" + resultApplicationName)))) .Returns(Task.FromResult(new object())); var requestParams = new GetConnectionStringParams() { OwnerUri = result.ConnectionInfo.OwnerUri, + ConnectionDetails = null, IncludePassword = false, IncludeApplicationName = false }; @@ -166,5 +168,32 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Connection await service.HandleGetConnectionStringRequest(requestParams, requestContext.Object); requestContext.VerifyAll(); } + + /// + /// Test HandleGetConnectionStringRequest + /// Using connection details to build connection string + /// + [Test] + public async Task GetCurrentConnectionStringTestwithConnectionDetails() + { + // If we make a connection to a live database + ConnectionService service = ConnectionService.Instance; + var result = LiveConnectionHelper.InitLiveConnectionInfo(); + var resultConnectionDetails = result.ConnectionInfo.ConnectionDetails; + var requestContext = new Mock>(); + + requestContext.Setup(x => x.SendResult(It.Is((connectionString) => connectionString.Contains(resultConnectionDetails.ToString())))) + .Returns(Task.FromResult(new object())); + var requestParams = new GetConnectionStringParams() + { + OwnerUri = null, + ConnectionDetails = {ServerName = "testServer", DatabaseName = "testDatabase", UserName = "sa", Password = "password", ApplicationName = "TestApp"}, + IncludePassword = true, + IncludeApplicationName = true + }; + + await service.HandleGetConnectionStringRequest(requestParams, requestContext.Object); + requestContext.VerifyAll(); + } } }