Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions extensions/mssql/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2033,6 +2033,12 @@
"default": null,
"scope": "resource"
},
"mssql.results.openAfterSave": {
"type": "boolean",
"description": "%mssql.results.openAfterSave%",
"default": true,
"scope": "resource"
},
"mssql.saveAsCsv.includeHeaders": {
"type": "boolean",
"description": "%mssql.saveAsCsv.includeHeaders%",
Expand Down
1 change: 1 addition & 0 deletions extensions/mssql/package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@
"mssql.messagesDefaultOpen": "True for the messages pane to be open by default; false for closed",
"mssql.resultsFontFamily": "Set the font family for the results grid; set to blank to use the editor font",
"mssql.resultsFontSize": "Set the font size for the results grid; set to blank to use the editor size",
"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.",
"mssql.saveAsCsv.includeHeaders": "[Optional] When true, column headers are included when saving results as CSV",
"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 (|)",
"mssql.saveAsCsv.lineSeparator": "[Optional] Character(s) used for separating rows when saving results as CSV",
Expand Down
1 change: 1 addition & 0 deletions extensions/mssql/src/constants/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ export const configMyConnections = "connections";
export const configSaveAsCsv = "saveAsCsv";
export const configSaveAsJson = "saveAsJson";
export const configSaveAsExcel = "saveAsExcel";
export const configResultsOpenAfterSave = "results.openAfterSave";
export const configRecentConnections = "recentConnections";
export const configMaxRecentConnections = "maxRecentConnections";
export const configCopyRemoveNewLine = "copyRemoveNewLine";
Expand Down
14 changes: 12 additions & 2 deletions extensions/mssql/src/models/resultsSerializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export default class ResultsSerializer {

private getConfigForCsv(): Contracts.SaveResultsAsCsvRequestParams {
// get save results config from vscode config
let config = this._vscodeWrapper.getConfiguration(
const config = this._vscodeWrapper.getConfiguration(
Constants.extensionConfigSectionName,
this._uri,
);
Expand Down Expand Up @@ -201,6 +201,14 @@ export default class ResultsSerializer {
);
}

private shouldOpenSavedFile(): boolean {
const config = this._vscodeWrapper.getConfiguration(
Constants.extensionConfigSectionName,
this._uri,
);
return config.get<boolean>(Constants.configResultsOpenAfterSave, true);
}

/**
* Send request to sql tools service to save a result set
*/
Expand Down Expand Up @@ -254,7 +262,9 @@ export default class ResultsSerializer {
self._vscodeWrapper.logToOutputChannel(
LocalizedConstants.msgSaveSucceeded + filePath,
);
self.openSavedFile(self._filePath, format);
if (self.shouldOpenSavedFile()) {
self.openSavedFile(self._filePath, format);
}
}
},
(error) => {
Expand Down
50 changes: 50 additions & 0 deletions extensions/mssql/test/unit/saveResults.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,20 @@ suite("save results tests", () => {
function testSaveSuccess(format: string): Thenable<void> {
configureSuccess();
const saveResults = createSerializer();
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");
return saveResults.onSaveResults(testFile, 0, 0, format, undefined).then(() => {
expect(vscodeWrapper.showInformationMessage).to.have.been.calledOnce;
expect(openSavedFileStub).to.have.been.calledOnceWith(fileUri.fsPath, format);
});
Comment on lines 96 to 99
Comment thread
aasimkhan30 marked this conversation as resolved.
}

function testSaveFailure(format: string): Thenable<void> {
configureFailure("failure");
const saveResults = createSerializer();
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");
return saveResults.onSaveResults(testFile, 0, 0, format, undefined).then(() => {
expect(vscodeWrapper.showErrorMessage).to.have.been.calledOnce;
expect(openSavedFileStub).to.not.have.been.called;
});
}

Expand Down Expand Up @@ -129,6 +133,44 @@ suite("save results tests", () => {
return testSaveFailure("excel");
});

test("Save as CSV - opens saved file when openAfterSave is enabled by default", () => {
configureSuccess();
const saveResults = createSerializer();
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");

return saveResults.onSaveResults(testFile, 0, 0, "csv", undefined).then(() => {
expect(openSavedFileStub).to.have.been.calledOnceWith(fileUri.fsPath, "csv");
Comment thread
aasimkhan30 marked this conversation as resolved.
});
});

test("Save as CSV - does not open saved file when openAfterSave is disabled", () => {
configureSuccess();
(vscodeWrapper.getConfiguration as sinon.SinonStub).returns({
get: (key: string) => (key === "results.openAfterSave" ? false : undefined),
} as unknown as vscode.WorkspaceConfiguration);
const saveResults = createSerializer();
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");

return saveResults.onSaveResults(testFile, 0, 0, "csv", undefined).then(() => {
expect(vscodeWrapper.showInformationMessage).to.have.been.calledOnce;
expect(openSavedFileStub).to.not.have.been.called;
Comment thread
aasimkhan30 marked this conversation as resolved.
});
});

test("Save as Excel - does not open saved file when openAfterSave is disabled", () => {
configureSuccess();
(vscodeWrapper.getConfiguration as sinon.SinonStub).returns({
get: (key: string) => (key === "results.openAfterSave" ? false : undefined),
} as unknown as vscode.WorkspaceConfiguration);
const saveResults = createSerializer();
const openSavedFileStub = sandbox.stub(saveResults, "openSavedFile");

return saveResults.onSaveResults(testFile, 0, 0, "excel", undefined).then(() => {
expect(vscodeWrapper.showInformationMessage).to.have.been.calledOnce;
expect(openSavedFileStub).to.not.have.been.called;
Comment thread
aasimkhan30 marked this conversation as resolved.
});
});

test("Save as with selection - test if selected range is passed in parameters", () => {
const selection: Interfaces.ISlickRange[] = [
{
Expand Down Expand Up @@ -179,14 +221,22 @@ suite("save results tests", () => {
(vscodeWrapper.showSaveDialog as sinon.SinonStub).resolves(undefined);

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

expect(serverClient.sendRequest).to.not.have.been.called;
expect(openSavedFileStub).to.not.have.been.called;
});

test("CSV configuration options are properly applied", (done) => {
const customWrapper = stubVscodeWrapper(sandbox);
(customWrapper.showSaveDialog as sinon.SinonStub).resolves(fileUri);
(customWrapper.openTextDocument as sinon.SinonStub).resolves(
undefined as unknown as vscode.TextDocument,
);
(customWrapper.showTextDocument as sinon.SinonStub).resolves(
undefined as unknown as vscode.TextEditor,
);
(customWrapper.getConfiguration as sinon.SinonStub).returns({
saveAsCsv: {
delimiter: "\t",
Expand Down
3 changes: 3 additions & 0 deletions localization/xliff/vscode-mssql.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -7985,6 +7985,9 @@
<trans-unit id="mssql.objectExplorer.collapseConnectionGroupsOnStartupDescription">
<source xml:lang="en">When enabled, connection groups will be collapsed instead of expanded at startup.</source>
</trans-unit>
<trans-unit id="mssql.results.openAfterSave">
<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>
</trans-unit>
<trans-unit id="mssql.objectExplorer.groupBySchema">
<source xml:lang="en">When enabled, the database objects in Object Explorer will be categorized by schema.</source>
</trans-unit>
Expand Down
Loading