From 51cf9f5264b84715211239c187b701f01ec8406c Mon Sep 17 00:00:00 2001 From: Lewis Sanchez Date: Tue, 20 Aug 2024 17:28:31 -0700 Subject: [PATCH 1/8] Copy query results to the clipboard --- .../Contracts/CopyResultsRequest.cs | 6 ++++ .../QueryExecution/QueryExecutionService.cs | 30 +++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Contracts/CopyResultsRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Contracts/CopyResultsRequest.cs index 41d018bdae..75ccd4919e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Contracts/CopyResultsRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Contracts/CopyResultsRequest.cs @@ -49,4 +49,10 @@ public class CopyResultsRequest public static readonly RequestType Type = RequestType.Create("query/copy"); } + + public class CopyResultsToClipboardEvent + { + public static readonly EventType Type = + EventType.Create("query/copyToClipboard"); + } } \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/QueryExecutionService.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/QueryExecutionService.cs index c49a90375c..621cbb10ae 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/QueryExecutionService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/QueryExecutionService.cs @@ -29,6 +29,7 @@ using Microsoft.SqlTools.ServiceLayer.Workspace.Contracts; using Microsoft.SqlTools.ServiceLayer.Workspace; using Microsoft.SqlTools.Utility; +using TextCopy; namespace Microsoft.SqlTools.ServiceLayer.QueryExecution { @@ -206,6 +207,7 @@ public void InitializeService(ServiceHost serviceHost) serviceHost.SetRequestHandler(SimpleExecuteRequest.Type, HandleSimpleExecuteRequest, true); serviceHost.SetRequestHandler(QueryExecutionOptionsRequest.Type, HandleQueryExecutionOptionsRequest, true); serviceHost.SetRequestHandler(CopyResultsRequest.Type, HandleCopyResultsRequest, true); + serviceHost.SetEventHandler(CopyResultsToClipboardEvent.Type, HandleCopyResultsToClipboardNotification, true); // Register the file open update handler WorkspaceService.Instance.RegisterTextDocCloseCallback(HandleDidCloseTextDocumentNotification); @@ -777,6 +779,27 @@ private Task OnNewConnection(ConnectionInfo info) /// Handles the copy results. /// internal async Task HandleCopyResultsRequest(CopyResultsRequestParams requestParams, RequestContext requestContext) + { + StringBuilder builder = await GetStringBuilderToCopyQueryResults(requestParams); + + CopyResultsRequestResult result = new CopyResultsRequestResult + { + Results = builder.ToString() + }; + await requestContext.SendResult(result); + } + + /// + /// Handles copying results to the clipboard. + /// + internal async Task HandleCopyResultsToClipboardNotification(CopyResultsRequestParams requestParams, EventContext eventContext) + { + StringBuilder builder = await GetStringBuilderToCopyQueryResults(requestParams); + + await ClipboardService.SetTextAsync(builder.ToString()); + } + + private async Task GetStringBuilderToCopyQueryResults(CopyResultsRequestParams requestParams) { var valueSeparator = "\t"; var columnRanges = this.MergeRanges(requestParams.Selections.Select(selection => new Range() { Start = selection.FromColumn, End = selection.ToColumn }).ToList()); @@ -871,11 +894,8 @@ internal async Task HandleCopyResultsRequest(CopyResultsRequestParams requestPar pageStartRowIndex += rowsToFetch; } while (pageStartRowIndex < rowRange.End); } - CopyResultsRequestResult result = new CopyResultsRequestResult - { - Results = builder.ToString() - }; - await requestContext.SendResult(result); + + return builder; } #endregion From 2ada50cf0a7eea2c00cc62eb255661954b5d198a Mon Sep 17 00:00:00 2001 From: Lewis Sanchez Date: Tue, 20 Aug 2024 18:31:56 -0700 Subject: [PATCH 2/8] Add TextCopy NuGet package. --- Packages.props | 1 + .../Microsoft.SqlTools.ServiceLayer.csproj | 1 + 2 files changed, 2 insertions(+) diff --git a/Packages.props b/Packages.props index 5bbce37539..d4f78e844e 100644 --- a/Packages.props +++ b/Packages.props @@ -54,6 +54,7 @@ +