diff --git a/extensions/azuremonitor/package.json b/extensions/azuremonitor/package.json index 5c74a33757..8638e79032 100644 --- a/extensions/azuremonitor/package.json +++ b/extensions/azuremonitor/package.json @@ -209,7 +209,7 @@ "update-grammar": "node ../../build/npm/update-grammar.js Microsoft/vscode-azuremonitor ./syntaxes/azuremonitor.tmLanguage" }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "figures": "^2.0.0", "find-remove": "1.2.1", "@microsoft/ads-service-downloader": "^1.2.1", diff --git a/extensions/azuremonitor/yarn.lock b/extensions/azuremonitor/yarn.lock index 4ef6d13596..cfd5ca1ee3 100644 --- a/extensions/azuremonitor/yarn.lock +++ b/extensions/azuremonitor/yarn.lock @@ -75,9 +75,9 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/datavirtualization/package.json b/extensions/datavirtualization/package.json index d5b9618999..522a8e7fbb 100644 --- a/extensions/datavirtualization/package.json +++ b/extensions/datavirtualization/package.json @@ -107,7 +107,7 @@ "dependencies": { "@microsoft/ads-extension-telemetry": "^3.0.1", "@microsoft/ads-service-downloader": "^1.2.1", - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "vscode-nls": "^5.2.0" }, "devDependencies": { diff --git a/extensions/datavirtualization/yarn.lock b/extensions/datavirtualization/yarn.lock index d2ef836789..801c83ff7c 100644 --- a/extensions/datavirtualization/yarn.lock +++ b/extensions/datavirtualization/yarn.lock @@ -497,9 +497,9 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/import/package.json b/extensions/import/package.json index 2e1cbbc05e..79c509e00d 100644 --- a/extensions/import/package.json +++ b/extensions/import/package.json @@ -77,7 +77,7 @@ } }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "htmlparser2": "^3.10.1", "@microsoft/ads-service-downloader": "^1.2.1", "@microsoft/ads-extension-telemetry": "^3.0.1", diff --git a/extensions/import/src/test/utils.test.ts b/extensions/import/src/test/utils.test.ts index dee7eac482..0b2404c11a 100644 --- a/extensions/import/src/test/utils.test.ts +++ b/extensions/import/src/test/utils.test.ts @@ -78,7 +78,7 @@ export class TestQueryProvider implements azdata.QueryProvider { saveResults(requestParams: azdata.SaveResultsRequestParams): Thenable { throw new Error('Method not implemented.'); } - copyResults(requestParams: azdata.CopyResultsRequestParams): Thenable { + copyResults(requestParams: azdata.CopyResultsRequestParams): Thenable { throw new Error('Method not implemented.'); } setQueryExecutionOptions(ownerUri: string, options: azdata.QueryExecutionOptions): Thenable { diff --git a/extensions/import/yarn.lock b/extensions/import/yarn.lock index b030ad68a0..198c9a9829 100644 --- a/extensions/import/yarn.lock +++ b/extensions/import/yarn.lock @@ -572,9 +572,9 @@ crypt@~0.0.1: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/kusto/package.json b/extensions/kusto/package.json index ecf00b7a99..dd87942c74 100644 --- a/extensions/kusto/package.json +++ b/extensions/kusto/package.json @@ -427,7 +427,7 @@ } }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "figures": "^2.0.0", "find-remove": "1.2.1", "@microsoft/ads-service-downloader": "^1.2.1", diff --git a/extensions/kusto/yarn.lock b/extensions/kusto/yarn.lock index 25e1afb053..c3daa83c16 100644 --- a/extensions/kusto/yarn.lock +++ b/extensions/kusto/yarn.lock @@ -124,9 +124,9 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index a5cc983e24..4557587734 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -1567,7 +1567,7 @@ "dependencies": { "@microsoft/ads-extension-telemetry": "^3.0.1", "@microsoft/ads-service-downloader": "^1.2.1", - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "find-remove": "1.2.1", "vscode-languageclient": "5.2.1", "vscode-nls": "^4.0.0" diff --git a/extensions/mssql/yarn.lock b/extensions/mssql/yarn.lock index 8146e7452f..cd0919cb63 100644 --- a/extensions/mssql/yarn.lock +++ b/extensions/mssql/yarn.lock @@ -511,9 +511,9 @@ crypt@~0.0.1: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/sql-migration/package.json b/extensions/sql-migration/package.json index 68f5b9a917..5d066ba457 100644 --- a/extensions/sql-migration/package.json +++ b/extensions/sql-migration/package.json @@ -162,7 +162,7 @@ ] }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "@microsoft/ads-service-downloader": "^1.2.1", "@microsoft/ads-extension-telemetry": "^3.0.1", "uuid": "^8.3.2", diff --git a/extensions/sql-migration/yarn.lock b/extensions/sql-migration/yarn.lock index 06697991f7..7ac8879c0b 100644 --- a/extensions/sql-migration/yarn.lock +++ b/extensions/sql-migration/yarn.lock @@ -62,9 +62,9 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/src/sql/azdata.proposed.d.ts b/src/sql/azdata.proposed.d.ts index 7792f1dae0..c42968dc12 100644 --- a/src/sql/azdata.proposed.d.ts +++ b/src/sql/azdata.proposed.d.ts @@ -873,6 +873,13 @@ declare module 'azdata' { selections: SelectionRange[]; } + export interface CopyResultsRequestResult { + /** + * Result string from copy operation + */ + results: string; + } + export interface QueryProvider { /** * Notify clients that the URI for a connection has been changed. @@ -884,7 +891,7 @@ declare module 'azdata' { * ADS will use this if 'supportCopyResultsToClipboard' property is set to true in the provider contribution point in extension's package.json. * Otherwise, The default handler will load all the selected data to ADS and perform the copy operation. */ - copyResults?(requestParams: CopyResultsRequestParams): Thenable; + copyResults?(requestParams: CopyResultsRequestParams): Thenable; } export enum DataProviderType { diff --git a/src/sql/workbench/api/browser/mainThreadDataProtocol.ts b/src/sql/workbench/api/browser/mainThreadDataProtocol.ts index 61bc7ffa37..db953a6e67 100644 --- a/src/sql/workbench/api/browser/mainThreadDataProtocol.ts +++ b/src/sql/workbench/api/browser/mainThreadDataProtocol.ts @@ -161,7 +161,7 @@ export class MainThreadDataProtocol extends Disposable implements MainThreadData return Promise.resolve(self._serializationService.saveAs(requestParams.resultFormat, requestParams.filePath, undefined, true)); } }, - copyResults(requestParams: azdata.CopyResultsRequestParams): Promise { + copyResults(requestParams: azdata.CopyResultsRequestParams): Promise { return Promise.resolve(self._proxy.$copyResults(handle, requestParams)); }, initializeEdit(ownerUri: string, schemaName: string, objectName: string, objectType: string, rowLimit: number, queryString: string): Promise { diff --git a/src/sql/workbench/api/common/extHostDataProtocol.ts b/src/sql/workbench/api/common/extHostDataProtocol.ts index 622bf792d5..0e119c3686 100644 --- a/src/sql/workbench/api/common/extHostDataProtocol.ts +++ b/src/sql/workbench/api/common/extHostDataProtocol.ts @@ -420,7 +420,7 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape { return this._resolveProvider(handle).saveResults(requestParams); } - override $copyResults(handle: number, requestParams: azdata.CopyResultsRequestParams): Thenable { + override $copyResults(handle: number, requestParams: azdata.CopyResultsRequestParams): Thenable { const provider = this._resolveProvider(handle); if (provider.copyResults) { return provider.copyResults(requestParams); diff --git a/src/sql/workbench/api/common/sqlExtHost.protocol.ts b/src/sql/workbench/api/common/sqlExtHost.protocol.ts index e9ff853903..f9b07170c6 100644 --- a/src/sql/workbench/api/common/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/common/sqlExtHost.protocol.ts @@ -254,7 +254,7 @@ export abstract class ExtHostDataProtocolShape { /** * Copies the selected data to clipboard. */ - $copyResults(handle: number, requestParams: azdata.CopyResultsRequestParams): Thenable { throw ni(); } + $copyResults(handle: number, requestParams: azdata.CopyResultsRequestParams): Thenable { throw ni(); } /** * Commits all pending edits in an edit session diff --git a/src/sql/workbench/services/query/common/queryManagement.ts b/src/sql/workbench/services/query/common/queryManagement.ts index aecb9e8365..fce00c548e 100644 --- a/src/sql/workbench/services/query/common/queryManagement.ts +++ b/src/sql/workbench/services/query/common/queryManagement.ts @@ -69,7 +69,7 @@ export interface IQueryManagementService { changeConnectionUri(newUri: string, oldUri: string): Promise; saveResults(requestParams: azdata.SaveResultsRequestParams): Promise; setQueryExecutionOptions(uri: string, options: azdata.QueryExecutionOptions): Promise; - copyResults(params: azdata.CopyResultsRequestParams): Promise; + copyResults(params: azdata.CopyResultsRequestParams): Promise; // Callbacks onQueryComplete(result: azdata.QueryExecuteCompleteNotificationResult): void; @@ -108,7 +108,7 @@ export interface IQueryRequestHandler { disposeQuery(ownerUri: string): Promise; connectionUriChanged(newUri: string, oldUri: string): Promise; saveResults(requestParams: azdata.SaveResultsRequestParams): Promise; - copyResults(requestParams: azdata.CopyResultsRequestParams): Promise; + copyResults(requestParams: azdata.CopyResultsRequestParams): Promise; setQueryExecutionOptions(ownerUri: string, options: azdata.QueryExecutionOptions): Promise; // Edit Data actions @@ -364,7 +364,7 @@ export class QueryManagementService implements IQueryManagementService { }); } - public copyResults(requestParams: azdata.CopyResultsRequestParams): Promise { + public copyResults(requestParams: azdata.CopyResultsRequestParams): Promise { return this._runAction(requestParams.ownerUri, (runner) => { return runner.copyResults(requestParams); }); diff --git a/src/sql/workbench/services/query/common/queryModelService.ts b/src/sql/workbench/services/query/common/queryModelService.ts index 216c2b3b70..15ba247328 100644 --- a/src/sql/workbench/services/query/common/queryModelService.ts +++ b/src/sql/workbench/services/query/common/queryModelService.ts @@ -21,6 +21,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import Severity from 'vs/base/common/severity'; import EditQueryRunner from 'sql/workbench/services/editData/common/editQueryRunner'; import { IRange } from 'vs/editor/common/core/range'; +import { ClipboardData, IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; const selectionSnippetMaxLen = 100; @@ -82,6 +83,7 @@ export class QueryModelService implements IQueryModelService { constructor( @IInstantiationService private _instantiationService: IInstantiationService, @INotificationService private _notificationService: INotificationService, + @IClipboardService private _clipboardService: IClipboardService, @ILogService private _logService: ILogService ) { this._queryInfoMap = new Map(); @@ -170,7 +172,11 @@ export class QueryModelService implements IQueryModelService { public async copyResults(uri: string, selection: Slick.Range[], batchId: number, resultId: number, includeHeaders?: boolean): Promise { if (this._queryInfoMap.has(uri)) { - return this._queryInfoMap.get(uri)!.queryRunner!.copyResults(selection, batchId, resultId, includeHeaders); + const results = await this._queryInfoMap.get(uri)!.queryRunner!.copyResults(selection, batchId, resultId, includeHeaders); + let clipboardData: ClipboardData = { + text: results.results + }; + this._clipboardService.write(clipboardData); } } diff --git a/src/sql/workbench/services/query/common/queryRunner.ts b/src/sql/workbench/services/query/common/queryRunner.ts index cded1f849b..07e6461951 100644 --- a/src/sql/workbench/services/query/common/queryRunner.ts +++ b/src/sql/workbench/services/query/common/queryRunner.ts @@ -11,7 +11,7 @@ import { ResultSerializer, SaveFormat } from 'sql/workbench/services/query/commo import * as azdata from 'azdata'; import * as nls from 'vs/nls'; -import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { ClipboardData, IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import * as types from 'vs/base/common/types'; import { Disposable } from 'vs/base/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -483,8 +483,8 @@ export default class QueryRunner extends Disposable { * @param resultId The result id of the result to copy from * @param includeHeaders [Optional]: Should column headers be included in the copy selection */ - async copyResults(selections: Slick.Range[], batchId: number, resultId: number, includeHeaders?: boolean): Promise { - await this.queryManagementService.copyResults({ + async copyResults(selections: Slick.Range[], batchId: number, resultId: number, includeHeaders?: boolean): Promise { + return this.queryManagementService.copyResults({ ownerUri: this.uri, batchIndex: batchId, resultSetIndex: resultId, @@ -606,7 +606,11 @@ export class QueryGridDataProvider implements IGridDataProvider { private async handleCopyRequestByProvider(selections: Slick.Range[], includeHeaders?: boolean): Promise { executeCopyWithNotification(this._notificationService, this._configurationService, selections, async () => { - await this.queryRunner.copyResults(selections, this.batchId, this.resultSetId, this.shouldIncludeHeaders(includeHeaders)); + let results = await this.queryRunner.copyResults(selections, this.batchId, this.resultSetId, this.shouldIncludeHeaders(includeHeaders)); + let clipboardData: ClipboardData = { + text: results.results + } + this._clipboardService.write(clipboardData); }); } diff --git a/src/sql/workbench/services/query/test/common/testQueryManagementService.ts b/src/sql/workbench/services/query/test/common/testQueryManagementService.ts index b3c0d1f4ea..3f9ac8b467 100644 --- a/src/sql/workbench/services/query/test/common/testQueryManagementService.ts +++ b/src/sql/workbench/services/query/test/common/testQueryManagementService.ts @@ -66,7 +66,7 @@ export class TestQueryManagementService implements IQueryManagementService { saveResults(requestParams: azdata.SaveResultsRequestParams): Promise { throw new Error('Method not implemented.'); } - copyResults(params: azdata.CopyResultsRequestParams): Promise { + copyResults(params: azdata.CopyResultsRequestParams): Promise { throw new Error('Method not implemented.'); } setQueryExecutionOptions(uri: string, options: azdata.QueryExecutionOptions): Promise {