Skip to content

Commit 335af02

Browse files
aasimkhan30Aasim KhanCopilot
authored
Add setting to disable opening saved query results (#22062)
* Add setting to disable opening saved query results * Update localization for query export setting * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Aasim Khan <aasimkhan@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
1 parent 4b31656 commit 335af02

6 files changed

Lines changed: 73 additions & 2 deletions

File tree

extensions/mssql/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2033,6 +2033,12 @@
20332033
"default": null,
20342034
"scope": "resource"
20352035
},
2036+
"mssql.results.openAfterSave": {
2037+
"type": "boolean",
2038+
"description": "%mssql.results.openAfterSave%",
2039+
"default": true,
2040+
"scope": "resource"
2041+
},
20362042
"mssql.saveAsCsv.includeHeaders": {
20372043
"type": "boolean",
20382044
"description": "%mssql.saveAsCsv.includeHeaders%",

extensions/mssql/package.nls.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
"mssql.messagesDefaultOpen": "True for the messages pane to be open by default; false for closed",
128128
"mssql.resultsFontFamily": "Set the font family for the results grid; set to blank to use the editor font",
129129
"mssql.resultsFontSize": "Set the font size for the results grid; set to blank to use the editor size",
130+
"mssql.results.openAfterSave": "When enabled, saved query result exports are opened after export. Excel exports open with the system file handler; text exports open in VS Code.",
130131
"mssql.saveAsCsv.includeHeaders": "[Optional] When true, column headers are included when saving results as CSV",
131132
"mssql.saveAsCsv.delimiter": "[Optional] Delimiter for separating data items when saving results as CSV. Choose from common separators like comma (,), tab (\\t), semicolon (;), or pipe (|)",
132133
"mssql.saveAsCsv.lineSeparator": "[Optional] Character(s) used for separating rows when saving results as CSV",

extensions/mssql/src/constants/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ export const configMyConnections = "connections";
266266
export const configSaveAsCsv = "saveAsCsv";
267267
export const configSaveAsJson = "saveAsJson";
268268
export const configSaveAsExcel = "saveAsExcel";
269+
export const configResultsOpenAfterSave = "results.openAfterSave";
269270
export const configRecentConnections = "recentConnections";
270271
export const configMaxRecentConnections = "maxRecentConnections";
271272
export const configCopyRemoveNewLine = "copyRemoveNewLine";

extensions/mssql/src/models/resultsSerializer.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export default class ResultsSerializer {
7474

7575
private getConfigForCsv(): Contracts.SaveResultsAsCsvRequestParams {
7676
// get save results config from vscode config
77-
let config = this._vscodeWrapper.getConfiguration(
77+
const config = this._vscodeWrapper.getConfiguration(
7878
Constants.extensionConfigSectionName,
7979
this._uri,
8080
);
@@ -201,6 +201,14 @@ export default class ResultsSerializer {
201201
);
202202
}
203203

204+
private shouldOpenSavedFile(): boolean {
205+
const config = this._vscodeWrapper.getConfiguration(
206+
Constants.extensionConfigSectionName,
207+
this._uri,
208+
);
209+
return config.get<boolean>(Constants.configResultsOpenAfterSave, true);
210+
}
211+
204212
/**
205213
* Send request to sql tools service to save a result set
206214
*/
@@ -254,7 +262,9 @@ export default class ResultsSerializer {
254262
self._vscodeWrapper.logToOutputChannel(
255263
LocalizedConstants.msgSaveSucceeded + filePath,
256264
);
257-
self.openSavedFile(self._filePath, format);
265+
if (self.shouldOpenSavedFile()) {
266+
self.openSavedFile(self._filePath, format);
267+
}
258268
}
259269
},
260270
(error) => {

extensions/mssql/test/unit/saveResults.test.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,20 @@ suite("save results tests", () => {
9292
function testSaveSuccess(format: string): Thenable<void> {
9393
configureSuccess();
9494
const saveResults = createSerializer();
95+
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");
9596
return saveResults.onSaveResults(testFile, 0, 0, format, undefined).then(() => {
9697
expect(vscodeWrapper.showInformationMessage).to.have.been.calledOnce;
98+
expect(openSavedFileStub).to.have.been.calledOnceWith(fileUri.fsPath, format);
9799
});
98100
}
99101

100102
function testSaveFailure(format: string): Thenable<void> {
101103
configureFailure("failure");
102104
const saveResults = createSerializer();
105+
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");
103106
return saveResults.onSaveResults(testFile, 0, 0, format, undefined).then(() => {
104107
expect(vscodeWrapper.showErrorMessage).to.have.been.calledOnce;
108+
expect(openSavedFileStub).to.not.have.been.called;
105109
});
106110
}
107111

@@ -129,6 +133,44 @@ suite("save results tests", () => {
129133
return testSaveFailure("excel");
130134
});
131135

136+
test("Save as CSV - opens saved file when openAfterSave is enabled by default", () => {
137+
configureSuccess();
138+
const saveResults = createSerializer();
139+
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");
140+
141+
return saveResults.onSaveResults(testFile, 0, 0, "csv", undefined).then(() => {
142+
expect(openSavedFileStub).to.have.been.calledOnceWith(fileUri.fsPath, "csv");
143+
});
144+
});
145+
146+
test("Save as CSV - does not open saved file when openAfterSave is disabled", () => {
147+
configureSuccess();
148+
(vscodeWrapper.getConfiguration as sinon.SinonStub).returns({
149+
get: (key: string) => (key === "results.openAfterSave" ? false : undefined),
150+
} as unknown as vscode.WorkspaceConfiguration);
151+
const saveResults = createSerializer();
152+
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");
153+
154+
return saveResults.onSaveResults(testFile, 0, 0, "csv", undefined).then(() => {
155+
expect(vscodeWrapper.showInformationMessage).to.have.been.calledOnce;
156+
expect(openSavedFileStub).to.not.have.been.called;
157+
});
158+
});
159+
160+
test("Save as Excel - does not open saved file when openAfterSave is disabled", () => {
161+
configureSuccess();
162+
(vscodeWrapper.getConfiguration as sinon.SinonStub).returns({
163+
get: (key: string) => (key === "results.openAfterSave" ? false : undefined),
164+
} as unknown as vscode.WorkspaceConfiguration);
165+
const saveResults = createSerializer();
166+
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");
167+
168+
return saveResults.onSaveResults(testFile, 0, 0, "excel", undefined).then(() => {
169+
expect(vscodeWrapper.showInformationMessage).to.have.been.calledOnce;
170+
expect(openSavedFileStub).to.not.have.been.called;
171+
});
172+
});
173+
132174
test("Save as with selection - test if selected range is passed in parameters", () => {
133175
const selection: Interfaces.ISlickRange[] = [
134176
{
@@ -179,14 +221,22 @@ suite("save results tests", () => {
179221
(vscodeWrapper.showSaveDialog as sinon.SinonStub).resolves(undefined);
180222

181223
const saveResults = createSerializer();
224+
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");
182225
await saveResults.onSaveResults(testFile, 0, 0, "csv", undefined);
183226

184227
expect(serverClient.sendRequest).to.not.have.been.called;
228+
expect(openSavedFileStub).to.not.have.been.called;
185229
});
186230

187231
test("CSV configuration options are properly applied", (done) => {
188232
const customWrapper = stubVscodeWrapper(sandbox);
189233
(customWrapper.showSaveDialog as sinon.SinonStub).resolves(fileUri);
234+
(customWrapper.openTextDocument as sinon.SinonStub).resolves(
235+
undefined as unknown as vscode.TextDocument,
236+
);
237+
(customWrapper.showTextDocument as sinon.SinonStub).resolves(
238+
undefined as unknown as vscode.TextEditor,
239+
);
190240
(customWrapper.getConfiguration as sinon.SinonStub).returns({
191241
saveAsCsv: {
192242
delimiter: "\t",

localization/xliff/vscode-mssql.xlf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7998,6 +7998,9 @@
79987998
<trans-unit id="mssql.objectExplorer.collapseConnectionGroupsOnStartupDescription">
79997999
<source xml:lang="en">When enabled, connection groups will be collapsed instead of expanded at startup.</source>
80008000
</trans-unit>
8001+
<trans-unit id="mssql.results.openAfterSave">
8002+
<source xml:lang="en">When enabled, saved query result exports are opened after export. Excel exports open with the system file handler; text exports open in VS Code.</source>
8003+
</trans-unit>
80018004
<trans-unit id="mssql.objectExplorer.groupBySchema">
80028005
<source xml:lang="en">When enabled, the database objects in Object Explorer will be categorized by schema.</source>
80038006
</trans-unit>

0 commit comments

Comments
 (0)